OpenCV学习笔记17-直方图
2017-08-14 11:06
162 查看
1.什么是直方图
通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的x轴是灰度值(0到255),y轴是图片中具有同一个灰度值的点的数目;
直方图是根据灰度图像绘制的,而不是彩色图像。
关于上面这幅图片和它的直方图:直方图的左侧是暗一点的像素数量,右侧是亮一点的像素数量。从这幅图上你可以看到灰暗区域比亮区域要大,而处于中间部分的像素点很少。
2.统计直方图
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> histimages:[],原图像(图像格式为 uint8 或 float32);
channels:[],表示选择一个通道来计算。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像,传入的参数可以是 [0], [1], [2] 它们分别对应着通道 B, G, R。
mask:掩模图像。要统计整幅图像的直方图就把它设为 None。但如果统计图像某一部分的直方图的话,需要制作一个掩模图像,并使用它。
histSize:[],BIN的数目;
ranges:[],像素值范围,通常为 [0,256]。
hist:输出数组,[histSize x 1],每一个值代表了与之灰度值对应的像素点数目。
3.绘制直方图
使用 Matplotlib 中的绘图函数(1)plt.hist()可以直接统计并绘制直方图
import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('1.png', 0) plt.hist(img.ravel(), 256, [0,256]) #统计并绘制直方图 plt.show()
(2)opencv函数统计直方图+matplotlib的绘图功能
这在同时绘制多通道(BGR)的直方图,很有用。
import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('1.png') color = ('b','g','r') #对一个列表或数组既要遍历索引又要遍历元素时,使用enumerat 4000 e()函数 #enumerate()将数组或列表组成一个索引序列,既有索引又有元素 for i,col in enumerate(color): histr = cv2.calcHist(
从上边的直方图可以推断出:蓝色曲线靠右侧的最多(很明显这些就是天空)
(3)使用掩膜
统计图像某个局部区域的直方图,需要构建一副掩模图像。将要统计的部分设置成白色,其余部分为黑色,就构成了一副掩模图像。然后把掩模图像传给函数就可以了。import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('1.png', 0) #创建一个mask mask = np.zeros(img.shape[:2], np.uint8) mask[100:300, 100:400] = 255 masked_img = cv2.bitwise_and(img, img, mask=mask) #统计无mask和有mask的直方图 hist_full = cv2.calcHist(
其中蓝线是整幅图像的直方图,绿线是进行掩模之后的直方图。4.直方图均衡化
作用:把直方图做一个横向拉伸,改善图像的对比度。
cv2.equalizeHist(src[, dst]) -> dst
src:输入图片,是一副灰度图像;
dst:输出结果,直方图均衡化之后的图像。import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('3.png', 0) equ = cv2.equalizeHist(img) res = np.hstack((img, equ)) #stacking images side-by-side cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows()5.有限对比适应性直方图均衡化(CLAHE)
(1)自适应的直方图均衡化:
整幅图像会被分成很多小块,这些小块被称为“tiles”(OpenCV中tiles的大小默认是8x8),然后再对每一个小块分别进行直方图均衡化。
优点:该算法更适合于改进图像的局部对比度以及获得更多的图像细节。
缺点:如果有噪声的话,噪声会被放大。
(2)有限对比适应性直方图均衡化(CLAHE):
为了避免放大噪声这种情况的出现,在自适应的直方图均衡化的基础上,使用对比度限制。
对于每个小块来说,如果直方图中的bin超过对比度的上限的话,就把其中的像素点均匀分散到其他 bins 中,然后在进行直方图均衡化。
最后,为了去除每一个小块之间“人造的”(由于算法造成)边界,再使用双线性差值,对小块进行缝合。
cv2.createCLAHE([, clipLimit[, tileGridSize]]) -> retval
clipLimit代表裁剪限幅的大小
tileGridSize代表局部区域的大小import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('3.png', 0) #create a CLAHE object clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) cll = clahe.apply(img) cv2.imshow('img', img) cv2.imshow('cll', cll) cv2.waitKey(0) cv2.destroyAllWindows()
原图
有限对比适应性直方图均衡化(CLAHE)
整体直方图均衡化
相关文章推荐
- OpenCV 2 学习笔记(17): 均衡化图像直方图
- OpenCV学习笔记(16):直方图
- opencv学习笔记9 直方图均衡化并绘制直方图
- 我的OpenCV学习笔记(13):计算直方图,利用查找表拉伸直方图,直方图均衡
- OpenCV学习笔记——图像处理之直方图ImgProc
- OpenCV学习笔记(17)双目测距与三维重建的OpenCV实现问题集锦(二)双目定标与双目校正
- OpenCV学习笔记(17)双目测距与三维重建的OpenCV实现问题集锦(二)双目定标与双目校正
- Python OpenCV学习笔记之:图像直方图反向投影(backprojection)原理简单实现
- 我的OpenCV学习笔记(17):利用形态学学滤波检测边沿和角点
- 基础学习笔记之opencv(19):有关图像序列的直方图计算
- Opencv学习笔记——绘制图像的像素直方图
- Python OpenCV学习笔记之:图像直方图反向投影
- Opencv2系列学习笔记6(直方图的应用)
- opencv学习笔记---图像直方图
- OpenCV学习笔记五:直方图
- Python OpenCV学习笔记之:计算彩色图像各通道的直方图及图像区域直方图
- opencv学习笔记之四 c++和直方图
- OpenCV学习笔记六:直方图(2)
- 我的OpenCV学习笔记(14):用直方图对比完成基于内容的图像检索
- Python OpenCV学习笔记之:灰度图像的直方图计算