图像直方图

""" 图像的直方图,用来观察图像的主要特征颜色 """
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个参数:

  1. image输入图像,传入时应该用中括号[]括起来
  2. channels::传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[]传入。
  3. mask:掩膜图像。如果统计整幅图,那么为none。主要是如果要统计部分图的直方图,就得构造相应的炎掩膜来计算。
  4. histSize:灰度级的个数,需要中括号,比如[256]
  5. ranges:像素值的范围,通常[0,256],有的图像如果不是0-256,比如说你来回各种变换导致像素值负值、很大,则需要调整后才可以。

参考博客

Python enumerate() 函数
【Python OpenCV】图像直方图 calcHist方法 equalizeHist方法