直方图口诀
左边暗,右边亮,越往右靠光越强
偏左偏右都不好,反差要低山中央
两边高,中间小,光比很大细节少
不冒头,不断档,连绵起伏好风光。
直方图判断曝光
左边山脚见不到,暗部没有细节
右边山脚见不到,亮部没有细节
两边山脚见不到,明暗均有失
山峰靠右亮区大,山峰靠左暗影多
山谷如果在中央,中间影调细节少。
(1) 什么是直方图
直方图可以让你了解总体的图像像素强度分布,其X轴为像素值(一般范围为0~255),在Y轴上为图像中具有该像素值像素数。
直方图的作用: 通过直方图可以直观地i奥杰图像的对比度、亮度、强度分布等。
(2)寻找直方图
几个术语
BINS:直方图的柱的个数称为BINS,在OpenCV中表示为histSize
RANGE:测量的强度值的范围,一般为[0,255]
OpenCV中的直方图计算
使用cv2.calcHist(查找直方图):
cv.calcHist(images,channels,mask,histSize,ranges [,hist [,accumulate]])
images:它是uint8或float32类型的源图像。它应该放在方括号中,即“ [img]”。
channels:也以方括号给出。它是我们计算直方图的通道的索引。例如,如果输入为灰度图像,则其值为[0]。对于彩色图像,您可以传递[0],[1]或[2]分别计算蓝色,绿色或红色通道的直方图。、
mask:图像掩码。为了找到完整图像的直方图,将其指定为“无”。但是,如果要查找图像特定区域的直方图,则必须为此创建一个掩码图像并将其作为掩码。(文章后面再说)
histSize:这表示我们的BIN计数。需要放在方括号中。对于全尺寸,我们通过[256]。
ranges:这是我们的RANGE。通常为[0,256]。
#读取灰度图 img = cv.imread('home.jpg',0) hist = cv.calcHist([img],[0],None,[256],[0,256])
hist是256x1的数组,每个值对应于该图像中具有相应像素值的像素数。
(3) 绘制直方图
Matplotlib绘制直方图
a.绘制灰度图的直方图使用plt.hist()可以直接找到直方图并绘制,无需使用cv2.calsHist()函数
import cv2 as cv import matplotlib.pyplot as plt img = cv.imread('messi.png',0) plt.subplot(1,2,1)plt.imshow(img) plt.subplot(1,2,2)plt.hist(img.ravel(),256,[0,256]) plt.show()
b.绘制RGB图的直方图
import cv2 as cv import matplotlib.pyplot as plt img = cv.imread('apple.png') #BGR img1=img.copy() img1[:,:,2],img1[:,:,0] =img[:,:,0],img[:,:,2] #BGR->RGB plt.subplot(1,2,1)plt.imshow(img1) color=('b','g','r') plt.subplot(1,2,2) for i,col in enumerate(color): hist=cv.calcHist([img],[i],None,[256],[0,256]) #找到第i个通道的直方图数据 plt.plot(hist,color=col) plt.xlim([0,256]) plt.show()