『youcans 的 OpenCV 例程200篇 - 总目录』
【OpenCV 例程200篇】45. 图像的灰度直方图
图像直方图是反映图像像素分布的统计表,横坐标代表像素值的取值区间,纵坐标代表每一像素值在图像中的像素总数或者所占的百分比。 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数。
灰度直方图反映了图像中的灰度分布规律,直观地表现了图像中各灰度级的占比,很好地体现出图像的亮度和对比度信息:灰度图分布居中说明亮度正常,偏左说明亮度较暗,偏右表明亮度较高;狭窄陡峭表明对比度降低,宽泛平缓表明对比度较高。
根据直方图的形态可以判断图像的质量,通过调控直方图的形态可以改善图像的质量。
OpenCV 提供了函数 cv2.calcHist 可以计算直方图,Numpy 中的函数 np.bincount 也可以实现同样的功能。
函数说明:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) → hist
函数 cv2.calcHist 可以计算一维直方图或二维直方图,函数的参数 images, channels, histSize, ranges 在计算一维直方图时也要带 [] 号。
参数说明:
- images:输入图像,用 [] 括号表示
- channels: 直方图计算的通道,用 [] 括号表示
- mask:掩模图像,一般置为 None
- histSize:直方柱的数量,一般取 256
- ranges:像素值的取值范围,一般为 [0,256]
- 返回值 hist:返回每一像素值在图像中的像素总数,形状为 (histSize,1)
注意:
-
- 参数 images, channels, histSize, ranges 都要带 [] 号。
-
- mask 是与 images 大小相同的掩模图像,掩模为 0 的区域不作处理。不使用掩模时设为 None。
3. channels 设置对彩色图像的指定通道计算直方图,灰度图像时设为 0。
4. Numpy 中的函数 np.bincount 也可以实现同样的功能,但该函数返回值的形状为 (histSize,)
- mask 是与 images 大小相同的掩模图像,掩模为 0 的区域不作处理。不使用掩模时设为 None。
例程:1.57 图像的灰度直方图
# 1.57 图像的灰度直方图img = cv2.imread("../images/imgLena.tif", flags=0) # flags=0 读取为灰度图像histCV = cv2.calcHist([img], [0], None, [256], [0, 256]) # OpenCV 函数 cv2.calcHisthistNP, bins = np.histogram(img.flatten(), 256)print(histCV.shape, histNP.shape) # histCV: (256, 1), histNP: (256,)plt.figure(figsize=(10,3))plt.subplot(131), plt.imshow(img, cmap='gray', vmin=0, vmax=255), plt.title("Original"), plt.axis('off')plt.subplot(132,xticks=[], yticks=[]), plt.axis([0,255,0,np.max(histCV)])plt.bar(range(256), histCV[:,0]), plt.title("Gray Hist(cv2.calcHist)")plt.subplot(133,xticks=[], yticks=[]), plt.axis([0,255,0,np.max(histCV)])plt.bar(bins[:-1], histNP), plt.title("Gray Hist(np.histogram)")plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/121543352)
Copyright 2022 youcans, XUPT
Crated:2021-11-22
【第4章:灰度变换与直方图】
39. 图像灰度的线性变换
43. 图像的灰度变换(对数变换)
44. 图像的灰度变换(伽马变换)
45. 图像的灰度直方图