图像直方图
""" 图像的直方图,用来观察图像的主要特征颜色 """
import cv2 as cv
from matplotlib import pyplot as plt
def plot_demo(image):
# ravel 函数将多维数组转换为一维数组
plt.hist(image.ravel(), 256, range=[0, 256])
# 下面的函数里面加上字符串运行时会报错,给字符串去掉就好了
plt.show()
def image_hist(image):
color = ('blue', 'green', 'red')
# i是从0一直迭代到len(color)
for i, c in enumerate(color):
# 每一次循环获得每个通道的颜色值
hist = cv.calcHist([image], [i], None, [256], [0, 256])
# print(hist.shape) 打印出来结果均为(256,1)
# 指定颜色绘制散点图
plt.plot(hist, color=c)
# 现在绘图的x范围为0-256
plt.xlim([0, 256])
# 展示图像
plt.show()
src = cv.imread("main.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
image_hist(src)
cv.waitKey(0)
cv.destroyAllWindows()
结果显示
函数参数说明
Opencv给我们提供的函数是cv2.calcHist(),该函数有5个参数:
- image输入图像,传入时应该用中括号[]括起来
- channels::传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[]传入。
- mask:掩膜图像。如果统计整幅图,那么为none。主要是如果要统计部分图的直方图,就得构造相应的炎掩膜来计算。
- histSize:灰度级的个数,需要中括号,比如[256]
- ranges:像素值的范围,通常[0,256],有的图像如果不是0-256,比如说你来回各种变换导致像素值负值、很大,则需要调整后才可以。
参考博客
Python enumerate() 函数
【Python OpenCV】图像直方图 calcHist方法 equalizeHist方法