目录
- 一、灰度直方图
- 二、图像掩模的应用
- 三、直方图均衡化
- 1.直方图均衡化
- 2.自适应的直方图均衡化
一、灰度直方图
概念:
灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。(百度百科)
灰度直方图即对图像中的所有像素点灰度值大小频率的统计
部分定义:
1.dims:需要统计的特征数目。若为灰度图 dims = 1;若为BGR三色 dims = 3;
2.bins:每个特征空间子区段的数目。即直方图中竖条的个数;
3.range:统计特征的取值范围,一般来说是 [0, 256] 表示左闭右开
直方图的意义:
直方图能直观表现图像中像素强度分布:
低灰度级集中,则表示比较暗。
高灰度级集中,则表示比较亮。
中灰度级集中,动态范围不足,对比度比较差。
均衡分布的图像,从低到高,像素占据比较均衡。
Opencv API:
cv2.calcHist(img, channels, mask, histSize, ranges)
参数:
img
:原图像 注意:传入该函数时要加中括号即 [img]
channels
:如果入图像是灰度图它的值就是[0] ,如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
mask
:掩模图像。要统计整幅图像的直方图就把它设为None。若想统计图像某一部分的直方图的话则引用该掩模。
histSize
:histSize:bins的数目。也应该用中括号括起来,例如:[256]。
ranges
:像素值范围。通常为[0,256]。左闭右开
代码:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)greyScale_map = cv2.calcHist([gray], [0], None, [256], [0, 256])plt.plot(greyScale_map) #函数plt.plot()绘制曲线图
plt.grid() #函数plt.grid()打开绘图网线 使图片背景为网格状
plt.show()
二、图像掩模的应用
定义:
掩模也叫做掩码,在程序中用二值图像来表示,0值区域标识被遮盖的部分,255值区域表示被暴露的部分。
掩模的用途:
1.掩模可以提取图像中感兴趣的区域即ROI区域
2.掩模可以将图像中的某些部分屏蔽掉
一般通过numpy库中的函数建立掩模,然后通过图像与运算来求得ROI区域或屏蔽其他区域
代码:
#创建掩模 img.shape[:2]即仅引用img.shape的前两个参数(第三个参数为颜色通道, 前两个为长宽)
img_copy = img.copy()
mask = np.zeros(img.shape[:2], np.uint8)mask[200:300, 300:500] = 255 #划定感兴趣区域 做与运算时屏蔽区域为0感兴趣区域为255mask_copy = cv2.bitwise_and(img_copy, img_copy, mask = mask)
三、直方图均衡化
1.直方图均衡化
直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。灰度分布集中在较窄的区间往往会导致图像的不清晰,直方图均衡化即通过对直方图中像素灰度值的展宽来实现增强图像对比度。
Opencv API:
img_equal = cv2.equalizeHist(img)
2.自适应的直方图均衡化
原理:
将整幅图像分成很多小块,对每一个小块分别进行直方图均衡化,再使用双线性差值去除每个小块之间的边界,对每一小块进行拼接得到最终直方图均衡化的图像。
但是如果有噪声的话,噪声会被放大。所以为了避免这种情况的出现就要使用对比度限制。
Opencv API:
clahe = cv2.createCLAHE(clipLimit, tileGridSize)
dst = clahe.apply(img)
参数:
clipLimit
:颜色对比度的阈值,可选项,默认值 40
tileGridSize
:局部直方图均衡化的模板(邻域)大小,可选项,默认值 (8,8)
代码:
clahe = cv2.createCLAHE(4.0, (8, 8))
img_eq_2 = clahe.apply(img)