Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)

环境

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 - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第1张图片

在Opencv中调用 calcHist() 函数可以实现对图像像素点直方图的绘制

  • calcHist(img, channels, mask, histSize, ranges)
    参数解释:
  1. img: 一般转灰度图(因为要求原图像格式为Uint8或float32), 传入函数时要使用[ ]
  2. channels: 直方图 同样使用[ ]输入进去, 如果输入图像为灰度图像其值为0;如果是彩色图像为[0],[1],[2]
  3. mask: 掩码 如果统计整幅图为None , 如果只想统计一部分则要制作一个掩模图像并使用它
  4. histSize:BIN(直方图x轴的分段数 可以是(0,10)这就是一段),的数目,也应用[]
  5. ranges:指定统计的像素值范围
hist = cv2.calcHist([cat], [0], None, [256], [0, 256])
plt.hist(cat.ravel(), 256)
plt.show()

Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第2张图片
可以看出上图中像素点的值位于150 - 200 之间的较多;

cat = cv2.imread('F:/PycharmProjects/pjm_test/cat.jpg')
cv_show('cat', cat)

Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第3张图片
输出三通道的像素点直方图:

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()

Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第4张图片

进行掩码操作

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)

Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第5张图片

cat_mask = cv2.calcHist([cat], [0], mask, [256], [0, 256])
plt.plot(cat_mask)
plt.show()  # 可发现直方图的y轴值变小

Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第6张图片

直方图均衡化

  • 得到图像及原像素点直方图
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)

Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第7张图片Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第8张图片

  • 进行均衡化 调用 equalizeHist() 函数
equ = cv2.equalizeHist(clahe)
plt.hist(equ.ravel(), 256)
plt.show()  # 直方图均衡结果
cv_show('2', equ)

Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第9张图片Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第10张图片

可以看到均衡化之后,雕像的脸部细节减少, 但实际上我们不希望这样,我们想既要均衡化,也要保持细节,于是我们需要用到 自适应均衡化

  • 自适应均衡化 调用createCLAHE()
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()

Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第11张图片

可以看到处理后既降低了y值又使像素值更加集中

最后展示分别处理后的效果图Opencv - 图像直方图(掩码操作,直方图均衡化,自适应均衡化)_第12张图片

你可能感兴趣的:(Notes,CV,opencv,计算机视觉,python,深度学习)