本示例使用的OpenCV版本是:OpenCV 4.1.1
运行Python的编辑器:Jupyter notebook 6.0.0
实现目的
均衡化图片为的是归一化图像亮度和增强图像对比度,在本示例我们会使用 cv2.equalizeHist
函数进行处理灰度图像和彩色图像,然后再展示均衡化后的直方图,看其形状。
实现代码
1,加载所需要的库
import cv2
import numpy as np
import matplotlib.pyplot as plt
2,以灰度模式读取图片并显示原图
# 以灰度模式读取图片
img_gray = cv2.imread('dog.png',0)
# 显示原始图片
plt.imshow(img_gray,cmap='gray')
3,均衡化图像
由于灰度图像只有一个通道,所以可以直接使用 cv2.equalizeHist
。
# 使用 <code>cv2.equalizeHist</code> 函数进行归一化图像亮度和增强图像对比度
img_gray = cv2.equalizeHist(img_gray)
4,显示图像
plt.imshow(img_gray,cmap='gray')
可以看出以下图像的对比度明显增强了。
5,计算并显示直方图
hist, bins = np.histogram(img_gray, 256, [0, 255])
plt.fill_between(range(256), hist, 0)
plt.xlabel('pixel value')
plt.show()
看直方图的形状均以一个较平均的过度分布
6,以彩色模式读取并显示图片
img_color = cv2.imread('dog.png')
# OpenCV读取的图片模式是BGR,所以如果要使用plt显示图片颜色正常就需要转换成RGB色彩空间
img_color = cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)
# 显示图片
plt.imshow(img_color)
7,均衡化RGB三个通道
彩色图片有别与灰度图的区别是有三个通道,我把三个通道分别都均衡化了,小伙伴们可以试试只均衡一个或两个通道看看效果如何
# 0 -> R -> red 红色通道均衡化
img_color[...,0] = cv2.equalizeHist(img_color[..., 0])
# 1 -> G -> green 绿色通道均衡化
img_color[...,1] = cv2.equalizeHist(img_color[..., 1])
# 2 -> B -> blue 蓝色通道均衡化
img_color[...,2] = cv2.equalizeHist(img_color[..., 2])
8,显示均衡化后的图片
plt.imshow(img_color)
9,计算衡化后的图片的图片的直方图
hist, bins = np.histogram(img_color, 256, [0, 255])
10,显示直方图
plt.fill_between(range(256), hist, 0)
plt.xlabel('pixel value')
plt.show()
程序说明
我们演示了如何使用cv.equalizeHist
对灰度图进行均衡化,该函数只接受单通道图像,在彩色图像中我分离了RGB色彩的三个通道,分别均衡,也许会比较麻烦。小伙伴也可以尝试使用HVS色彩空间模式(HSV即色相、饱和度、明度(英语:Hue, Saturation, Value))的均衡化,HVS只需要改变一个明度通道就能全彩应用,是非常方便的,记得最后转回RGB色彩模式。
cv.equalizeHist
的详细用法请参考:
https://docs.opencv.org/4.1.1/d6/dc7/group__imgproc__hist.html#ga7e54091f0c937d49bf84152a16f76d6e