python : 3.6.10
Opencv : 4.1.2
IDE : pycharm
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 定义函数
def cv_show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像由很多个像素点组成,每个像素点的值都介于【0 255】,因此可以将一副图像的像素点直方图绘制出来:
图像使用:
cat = cv2.imread('F:/PycharmProjects/pjm_test/cat.jpg', 0)
在Opencv中调用 calcHist() 函数可以实现对图像像素点直方图的绘制
hist = cv2.calcHist([cat], [0], None, [256], [0, 256])
plt.hist(cat.ravel(), 256)
plt.show()
可以看出上图中像素点的值位于150 - 200 之间的较多;
cat = cv2.imread('F:/PycharmProjects/pjm_test/cat.jpg')
cv_show('cat', cat)
color = ('b', 'g', 'r')
for i, col in enumerate(color):
histr = cv2.calcHist([cat], [i], None, [256], [0, 256])
plt.plot(histr, color=col)
plt.xlim([0, 256])
plt.show()
mask = np.zeros(cat.shape[:2], np.uint8) # 创建掩码
mask[100:300, 100:400] = 255
mask_cat = cv2.bitwise_and(cat, cat, mask=mask) # 掩码和图片合并
cv_show('mask_cat', mask_cat)
cat_mask = cv2.calcHist([cat], [0], mask, [256], [0, 256])
plt.plot(cat_mask)
plt.show() # 可发现直方图的y轴值变小
clahe = cv2.imread('F:/PycharmProjects/pjm_test/clahe.jpg', 0)
hist = cv2.calcHist([clahe], [0], None, [256], [0, 256])
plt.hist(clahe.ravel(), 256)
plt.show()
cv_show('1', clahe)
equ = cv2.equalizeHist(clahe)
plt.hist(equ.ravel(), 256)
plt.show() # 直方图均衡结果
cv_show('2', equ)
可以看到均衡化之后,雕像的脸部细节减少, 但实际上我们不希望这样,我们想既要均衡化,也要保持细节,于是我们需要用到 自适应均衡化
clahe1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
clahe2 = clahe1.apply(clahe)
hist1 = cv2.calcHist([clahe2], [0], None, [256], [0, 256])
plt.hist(clahe2.ravel(), 256)
plt.show()
可以看到处理后既降低了y值又使像素值更加集中