直方图 与 均衡化

对图像求直方图,即统计每个像素值有多少个点

第一个参数为图像,第二个参数为图像通道(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()

 

自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
原文地址:https://www.cnblogs.com/WTSRUVF/p/15259003.html