对图像求直方图,即统计每个像素值有多少个点
第一个参数为图像,第二个参数为图像通道(0表示灰度图),第三个参数为掩膜(None表示没有)
第四个参数为直方图中有多少柱子,第五个参数为统计像素值的范围
img_x = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) hist = cv2.calcHist([img_x], [0], None, [256], [0, 255]) plt.hist(img_x.ravel(), 256) plt.show()
加掩膜:
#创建一个全黑掩膜(都为0), cover = np.zeros(img_x.shape[0 : 2], dtype = np.uint8) #特定区域设为255,即为白色,白色区域为不遮挡区域 cover[100 : 500, 30 : 500] = 255 cover_img = cv2.bitwise_and(img_x, img_x, mask = cover) cv2.imshow('cover', cover_img) cv2.waitKey(0) cv2.destroyAllWindows() #hist_cover = cv2.calcHist([cover_img], [0], None, [256], [0, 255]) hist_cover = cv2.calcHist([img_x], [0], cover, [256], [0, 255]) plt.hist(cover_img.ravel(), 256) plt.show()
均衡化:
将密集的直方图均衡一下
原理:
统计每个像素值的个数和其所占所有像素个数的比例,以及其累积概率(即概率前缀和)
用累积概率 * 255 四舍五入,即得均衡后当前像素值所对应的像素值
img_x = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) hist = cv2.calcHist([img_x], [0], None, [256], [0, 255]) plt.hist(img_x.ravel(), 256) plt.show() #均衡化操作,返回一个均衡后后的图像 img_equ = cv2.equalizeHist(img_x) hist_equ = cv2.calcHist([img_equ], [0], None, [256], [0, 255]) plt.hist(img_equ.ravel(), 256) plt.show() img = np.hstack((img_x, img_equ)) cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows()
局部均衡化:
即将一张图片分为若干格子,每个格子分别各自进行均衡化(可以防止个别细节消息,但噪声会造成影响)
clahe = cv2.createCLAHE(clipLimit = 2.0, tileGridSize = (8, 8)) img_clahe = clahe.apply(img_x) hist_clahe = cv2.calcHist([img_clahe], [0], None, [256], [0, 255]) plt.hist(img_clahe.ravel(), 256) plt.show() img_total = np.hstack((img_x, img_equ, img_clahe)) cv2.imshow('img_total', img_total) cv2.waitKey(0) cv2.destroyAllWindows()