OpenCV--直方图绘制以及直方图均衡化

OpenCV–直方图绘制以及直方图均衡化

一、直方图均衡化

函数:

hist = cv.calcHist( images, channels, mask, histSize, ranges[, hist[, accumulate]] )

  • images: 原图像图像格式为 uint8 或 float32,当传入函数时应用中括号 [] 括来例如[img];
  • channels: 同样用中括号括起来,告诉函数统计图像中的哪个颜色通道的直方图。如果输入图像是灰度图它的值就是 [0],如果是彩色图像传入的参数可以是 [0][1][2] 它们分别对应着 BGR;
  • mask: 掩模图像,统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图时,就需要使用它;
  • histSize:BIN 的数目,也应用中括号括来;
  • ranges: 像素值范围常为 [0,256] ;
  • hist:输出矩阵,表示整张图中bin的灰度图的个数。

代码示例:

import numpy as np 
import cv2 as cv
import matplotlib.pyplot as plt

#封装图像显示函数
def cv_show(name, img):
    cv.imshow(name, img)
    cv.waitKey(0)
    cv.destroyAllWindows()

#统计直方图
img_gray = cv.imread('./img/cat.jpg',0) 
hist = cv.calcHist([img_gray],[0],None,[256],[0,256])
hist.shape

(256, 1)

plt.hist(img_gray.ravel(), 256)
plt.show()

OpenCV--直方图绘制以及直方图均衡化_第1张图片

#多通道图像绘制
img = cv.imread("./img/cat.jpg")
color = ("b", "g", "r")

for i, color in enumerate(color):
    hist = cv.calcHist([img], [i], None, [256], [0, 256])
    plt.plot(hist, color = color)
    plt.xlim([0, 256])

OpenCV--直方图绘制以及直方图均衡化_第2张图片

mask操作

#创建一个mask
mask = np.zeros(img.shape[:2], np.uint8)
print(mask.shape)
mask[100:300, 100:400] = 255
cv_show("mask", mask)

(414, 500)

#用掩码对图像进行截取
img_masked = cv.bitwise_and(img_gray, img_gray, mask = mask )   #与操作

hist_full = cv.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv.calcHist([img], [0], mask, [256], [0, 256])

plt.subplot(221), plt.imshow(img_gray, "gray")
plt.subplot(222), plt.imshow(mask, "gray")
plt.subplot(223), plt.imshow(img_masked, "gray")
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()

OpenCV--直方图绘制以及直方图均衡化_第3张图片

二、直方图均衡化(HE)

函数:

dst = cv.equalizeHist( src[, dst] )

  • src:8位单通道图像。

原理参考:https://www.cnblogs.com/tianyalu/p/5687782.html
本质上就是算出每个灰度级上的概率(依次累加之前的概率),在乘以灰度级分布范围(例如灰度分布为(0-255),则范围为255-0)

代码示例:

img = cv.imread("./img/clahe.jpg", 0)

plt.hist(img.ravel(), 256)
plt.show()

OpenCV--直方图绘制以及直方图均衡化_第4张图片

#均值化 
#dst = cv.equalizeHist( src[, dst] )
dst = cv.equalizeHist(img)
plt.hist(dst.ravel(), 256)
plt.show()

OpenCV--直方图绘制以及直方图均衡化_第5张图片

三、自适应直方图均衡化(CLAHE)

原理参考博客:https://blog.csdn.net/lwx309025167/article/details/103770834

函数:

retval = cv.createCLAHE( [, clipLimit[, tileGridSize]] )

  • clipLimit:限制对比度阈值;
  • tileGridSize:直方图均衡化的网格大小。

代码示例:

#自适应直方图均衡化
#retval = cv.createCLAHE([, clipLimit[, tileGridSize]])
clahe = cv.createCLAHE(clipLimit = 2.0, tileGridSize = (8,8))
res_clahe = clahe.apply(img) #img需要均衡化的图片

res = np.hstack((img, res_clahe))
cv_show("res", res)

你可能感兴趣的:(OpenCV)