《数字图像处理-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:列表,掩模图像,与imagesk的尺寸相同,通常设为None。
  • histSize:列表,表示直方图的柱数bins,如256
  • ranges:直方图的像素值范围,通常设为0,255
  • hist:返回值,输出的直方图,形状为(histSize, K),K为列表长度。
  • accumulate:累积标志,表示多幅图像是否累积统计,默认为False。

注意问题

  • (1) images是列表类型,列表元素imagesk是Numpy数组。计算多幅图像的直方图时,images是多幅图像的列表,如img1,img2,...;当只有一幅图像时,images也要表示为列表形式,如 img。其他参数列表中的每个元素,分别与图像列表中的每幅图像相对应。
  • (2) 计算多幅图像的直方图时,该组图像的尺寸和数据类型必须相同。
  • (3) 对于灰度图像,通道编号channels为0;对于多通道彩色图像,以channels=ch表示计算第ch通道的直方图。
  • (4) 当只有一幅图像时,通道编号表示为channels=0;当有多幅图像时,通道编号表示为c1,c2,...,列表中的第k个元素channelsk对应第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,10,1,2计算彩色图像各通道的直方图,其结果是二维或三维直方图,而不是各通道的直方图。
  • (9) Numpy中的函数np.histogram也可以计算灰度图像的灰度直方图,注意函数返回值的形状为(256,)。Matplotlib中的函数plt.hist也可以计算并绘制灰度直方图,但OpenCV中的函数cv.calcHist的执行速度更快。
【例程0801】灰度图像与彩色图像的直方图

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

python 复制代码
# 【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

相关推荐
极连AI18 小时前
国产大模型譬如DeepSeek接入codex教程分享
人工智能·gpt·chatgpt·api·token·极连ai·zovelox.com
工控发烧友18 小时前
边缘计算 vs 云端处理:工业场景如何选择数据处理架构
人工智能·架构·边缘计算
海鸥-w18 小时前
用python (fastapi)做项目第一天创建项目结构,数据建表,ORM配置安装,写第一个接口
数据库·python·fastapi
keykey6.18 小时前
从感知机到神经网络:深度学习的起源
开发语言·人工智能·深度学习·机器学习
㳺三才人子18 小时前
初探 Flask-WTF
后端·python·flask·html5
来让爷抱一个18 小时前
MonkeyCode vs Copilot vs Cursor:三大 AI 编程工具深度对比
人工智能·安全·开源·ai编程
老兵发新帖19 小时前
ROS2工作区目录结构分析
人工智能
AI Dog19 小时前
MathHub数学建模交流社区-V2
人工智能·机器学习·数学建模·阿里云
澹锦汐19 小时前
Serverless 架构下的支付系统设计:独立开发者的零运维订阅计费实战
人工智能