《数字图像处理-OpenCV/Python》连载(56)图像的灰度直方图

《数字图像处理-OpenCV/Python》连载(56)非线性灰度变换


本书京东 优惠购书链接 https://item.jd.com/14098452.html
本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html

在这里插入图片描述


第 8 章 图像的直方图处理


图像的直方图是反映像素值分布的统计表,横坐标代表像素值的取值区间,纵坐标代表每一像素值在图像中的像素总数或所占比例。根据直方图的形态可以判断图像的质量,通过调控直方图的形态可以改善图像的质量。


本章内容概要

  • 学习图像的灰度直方图,理解灰度直方图的意义和作用。
  • 介绍基于直方图统计量的图像处理方法,如直方图均衡化、直方图匹配、基于局部直方图统计量的图像增强和限制对比度自适应直方图均衡化。

8.1 图像的灰度直方图

灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数。灰度直方图反映了图像的灰度分布规律,直观地表现了图像各灰度级的占比,很好地体现了图像的亮度和对比度信息。

OpenCV中的函数cv.calcHist用于计算一幅或多幅图像的直方图。

函数原型

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

参数说明

  • images:输入图像,是列表类型,图像的数据类型为CV_8U、CV_16U或CV_32F。
  • channels:列表,指定的图像通道编号,如[0]。
  • mask:列表,掩模图像,与images[k]的尺寸相同,通常设为None。
  • histSize:列表,表示直方图的柱数bins,如[256]。
  • ranges:直方图的像素值范围,通常设为[0,255]。
  • hist:返回值,输出的直方图,形状为(histSize, K),K为列表长度。
  • accumulate:累积标志,表示多幅图像是否累积统计,默认为False。

注意问题

  • (1) images是列表类型,列表元素images[k]是Numpy数组。计算多幅图像的直方图时,images是多幅图像的列表,如[img1,img2,…];当只有一幅图像时,images也要表示为列表形式,如 [img]。其他参数列表中的每个元素,分别与图像列表中的每幅图像相对应。
  • (2) 计算多幅图像的直方图时,该组图像的尺寸和数据类型必须相同。
  • (3) 对于灰度图像,通道编号channels为0;对于多通道彩色图像,以channels=[ch]表示计算第ch通道的直方图。
  • (4) 当只有一幅图像时,通道编号表示为channels=[0];当有多幅图像时,通道编号表示为[c1,c2,…],列表中的第k个元素channels[k]对应第k幅图像。
  • (5) 当只有一幅图像时,直方图的柱数表示为histSize=[256];当有多幅图像时,直方图的柱数表示为[256,256,…],列表中的第k个元素对应第k幅图像。
  • (6) 当只有一副图像时,返回值hist的形状为[256,1];当有K幅图像时,返回值hist的形状为[256,K],K为列表长度,其中,hist[:,k]表示第k幅图像的直方图。
  • (7) 掩模图像表示对遮蔽区域(置0像素)不做处理,只统计局部窗口区域(置1区域)内像素的直方图。当不使用掩模时要设mask=None。对于多幅图像计算直方图,必须使用相同的掩模图像,或者不使用掩模图像。
  • (8) 当计算彩色图像各通道的直方图时,推荐将彩色通道拆分为单通道,逐一计算各通道的直方图。注意:不能用channels=[0,1]或[0,1,2]计算彩色图像各通道的直方图,其结果是二维或三维直方图,而不是各通道的直方图。
  • (9) Numpy中的函数np.histogram也可以计算灰度图像的灰度直方图,注意函数返回值的形状为(256,)。Matplotlib中的函数plt.hist也可以计算并绘制灰度直方图,但OpenCV中的函数cv.calcHist的执行速度更快。

【例程0801】灰度图像与彩色图像的直方图

本例程用OpenCV函数和Numpy方法计算灰度图像的直方图和彩色图像各通道的直方图。注意彩色图像各通道的直方图,是以循环遍历方式对各通道分别计算的。


# 【0801】灰度图像与彩色图像的直方图
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    img = cv.imread("../images/Lena.tif", flags=1)  # 读取彩色图像
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 转为灰度图像

    # OpenCV:cv.calcHist 计算灰度图像的直方图
    histCV = cv.calcHist([gray], [0], None, [256], [0, 255])  # (256,1)

    # Numpy:np.histogram 计算灰度图像的直方图
    histNP, bins = np.histogram(gray.flatten(), 256)  # (256,)

    print(histCV.shape, histNP.shape)
    print(histCV.max(), histNP. max())
    plt.figure(figsize=(9, 3))
    plt.subplot(131, yticks=[]), plt.axis([0, 255, 0, np.max(histCV)])
    plt.title("1. Gray histogram (np.histogram)")
    plt.bar(bins[:-1], histNP)
    plt.subplot(132, yticks=[]), plt.axis([0, 255, 0, np.max(histCV)])
    plt.title("2. Gray histogram (cv.calcHist)")
    plt.bar(range(256), histCV[:, 0])

    # 计算和绘制彩色图像各通道的直方图
    plt.subplot(133, yticks=[])
    plt.title("3. Color histograms (cv.calcHist)")
    color = ['b', 'g', 'r']
    for ch, col in enumerate(color):
        histCh = cv.calcHist([img], [ch], None, [256], [0, 255])
        plt.plot(histCh, color=col)
        plt.xlim([0, 256])
    plt.tight_layout()
    plt.show()

程序说明:
运行结果,灰度图像与彩色图像的直方图如图8-1所示。
(1) 图8-1(1)所示为Numpy方法计算的灰度直方图,图8-1(2)所示为OpenCV函数计算的灰度直方图。
(2) 图 8-1(3)所示为彩色图像各通道的直方图,为了便于观察使用折线图代替柱状图来表示。

在这里插入图片描述

图8-1 灰度图像与彩色图像的直方图


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/134905849)
Copyright 2023 youcans, XUPT
Crated:2023-12-12

《数字图像处理-OpenCV/Python》 独家连载专栏 : https://blog.csdn.net/youcans/category_12418787.html

猜你喜欢

转载自blog.csdn.net/youcans/article/details/134905849