本文已参与「新人创作礼」活动,一起开启掘金创作之路。
【Python】openCV实现图像直方图
1基本原理
图像直方图为反映一幅图像中各灰度级与各灰度级像素出现的频率之间的关系图。
直方图的绘制是一个统计的过程,首先得到一张图片的灰度矩阵,接着将灰度值分为若干区间,统计每个灰度区间的像素数量,最后统计完图片中的所有像素即得到该图像的直方图。
hist函数的直方图绘制原理为将得到的一维数组进行统计,同样分为若干区间(bins),统计该数组中数值位于每个区间的个数,再在坐标系中进行可视化展示。其中的一维数组即为图像的灰度矩阵转化而来,彩色图像的灰度值可根据三个通道的色值在公式 R * 299/1000 + G * 587/1000+ B * 114/1000下转化获得。
例如: 我们处理如下3X3大小初始图像,我们首先将该图片表示为二维数组,接着扁平化处理为一维数组A(可用ravel()、flatten()等函数实现) A={16,17,71,76,67,61,71,16,76}

接着将灰度区间 [0,255] 划分为若干子区间,统计每个子区间内的像素数量,再根据要求判断是否需要进行归一化处理,最终得到所需直方图
在该例中我们划分为128个子区间,每个区间包含两个灰度值,因此统计出位于区间[16,18)的像素个数为3,[60,62)像素个数为1,[66,68)像素个数为1,[70,72)像素个数为2,[76,78)像素个数为2,从而得出下图所示直方图。由于灰度值分布过于集中,因此可以进行归一化将[16,78]区间灰度变换为 [0,255],以增加图像的清晰度。

2实现结果
import cv2 as cv
from matplotlib import pyplot as plt
image = cv.imread('C:/Users/18042/Desktop/Vision/jmu.jpg', 0)
plt.hist(image.ravel(), 256, [0, 256])
plt.show()
cv.waitKey()
cv.destroyAllWindows()

(3)RGB三通道直方图
import cv2 as cv
from matplotlib import pyplot as plt
image = cv.imread('C:/Users/18042/Desktop/Vision/jmu.jpg', 1)
color = ("blue", "green", "red")
for i, color in enumerate(color):
hist = cv.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color=color)
plt.xlim([0, 256])
plt.show()
cv.waitKey()
cv.destroyAllWindows()
