Python+opencv学习记录9:图像直方图

文章目录

  • 1.什么是图像直方图
  • 2.实际操作
    • 2.1.绘图库的安装
    • 2.2.绘图库直接计算直方图
    • 2.3.图像直方图的绘制
  • 完整代码

1.什么是图像直方图

从数学的角度来讲,直方图又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。
图像直方图是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。

2.实际操作

2.1.绘图库的安装

Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
要安装此库,我们需要打开命令行,按win+R,然后回车,在命令行中输入如下:

pip install matplotlib

然后回车,耐心等待安装完成。

2.2.绘图库直接计算直方图

我们想测试绘图库是否安装成功,可以直接用一张图像来绘制直方图,代码为:

def plot_demo(image):           # 计算直方图
    plt.hist(image.ravel(), 256, [0, 256])  # image.ravel()是将多维数组降为一维数组,256为bins数量,[0, 256]为范围
    plt.show("直方图")

原图为:
Python+opencv学习记录9:图像直方图_第1张图片
对用的直方图为:
Python+opencv学习记录9:图像直方图_第2张图片

2.3.图像直方图的绘制

我们绘制出了彩鳞小姐姐的直方图,但是这个并不是我们想要的三通道图像直方图,若想绘制出,我们需要使用calcHist这个API,
calcHist(images,channels,mask,histSize,ranges,hist=None,accumulate=None)
其参数为:
images:uint8或float32类型的源图像;
channels:它也用方括号括起来。它是我们计算直方图的信道的索引。例如,如果输入是灰度图像,它的值是0。对于颜色图像,您可以通过0、1或2来分别计算蓝色、绿色或红色通道的直方图;
mask:遮罩图。为了找到完整图像的直方图,它被指定为“None”;
histSize:这代表了我们的BINS数。需要用方括号来表示。在整个范围内,我们通过了256;
ranges:强度值范围,通常是 [ 0,256 ]。
我们就以彩鳞的图像来绘制三通道直方图,代码如下:

def image_hist(image):          # 绘制出三通道图像直方图
    color = ('blue', 'green', 'red')
    for i, color in enumerate(color):       # 遍历每一个颜色及它们的下标
   		# 计算出直方图,calcHist(images, channels, mask, histSize(有多少个bin), ranges[, hist[, accumulate]]) -> hist
        # hist 是一个 256x1 的数组,每一个值代表了与该灰度值对应的像素点数目。
        hist = cv.calcHist(image, [i], None, [256], [0, 256])
        plt.plot(hist, color=color)         # 矩阵上那些点,第二个参数是设置颜色
        plt.xlim([0, 256])                  # 设置x轴长度从0到256
    plt.show()

得到的直方图为:
Python+opencv学习记录9:图像直方图_第3张图片
这个图或许让人感到一脸蒙蔽,完全不知道能看出什么东西,上述直方图描述了BGR在三个通道在不同像素点的分布,有的地方分布着很多,有的地方很少。
为了让人更加直观地了解直方图,我们换一张图像来绘制直方图,原图为:
Python+opencv学习记录9:图像直方图_第4张图片
其直方图为:
Python+opencv学习记录9:图像直方图_第5张图片
由直方图可以看出波峰主要在150之后,这等于我们找到图像的特征值很有帮助,对图像的后续处理也很有帮助。

完整代码

import cv2 as cv                # 导入opencv模块
import numpy as np              # 导入数学函数库
from matplotlib import pyplot as plt  # 导入绘图库


def plot_demo(image):           # 计算直方图
    plt.hist(image.ravel(), 256, [0, 256])  # image.ravel()是将多维数组降为一维数组,256为bins数量,[0, 256]为范围
    plt.show("直方图")


def image_hist(image):          # 绘制出三通道图像直方图
    color = ('blue', 'green', 'red')
    for i, color in enumerate(color):       # 遍历每一个颜色及它们的下标
        # 计算出直方图,calcHist(images, channels, mask, histSize(有多少个bin), ranges[, hist[, accumulate]]) -> hist
        # hist 是一个 256x1 的数组,每一个值代表了与该灰度值对应的像素点数目。
        hist = cv.calcHist(image, [i], None, [256], [0, 256])
        plt.plot(hist, color=color)         # 矩阵上那些点,第二个参数是设置颜色
        plt.xlim([0, 256])                  # 设置x轴长度从0到256
    plt.show()


print("------------hello python!------------")

src = cv.imread("D:/opencv3/image/dlrb.jpg")
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
# plot_demo(src)
image_hist(src)

cv.waitKey(0)
cv.destroyAllWindows()          # 释放所有窗口

你可能感兴趣的:(Python+opencv学习,python,opencv,计算机视觉)