《数字图像处理-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/237856.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

约瑟夫问题

目录 方法一:数组模拟 方法二:链表模拟 方法三:数学递归 约瑟夫问题: 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。下一个人继续从 1 开始报数。 n-1 轮结束以后,只剩下…

人人都能用的AI编程助手 CodeGeeX

视频版:人人都能用的Ai编程助手——CodeGeeX 大家好,我是凌览。 现在距离 AI 大火已经快有一年啦,作为程序员可不得准备一款AI帮咱们干点活。本文分享一款 AI 工具 CodeGeeX,帮助大家提高一波学习和工作效率。 CodeGeeX 是什么…

Linux之Apache服务器安装及配置

一、Apache服务器简介 Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用。Apache曾经是世界使用排名第一的Web服务器软件&#xf…

strict-origin-when-cross-origin

严格限制同源策略 (1)允许服务器的同源IP地址访问 (2)允许Referer --- 后端服务器要配置

两线制 4-20mA 隔离变送器(输出回路供电)

两线制 4-20mA 隔离变送器(输出回路供电) 特征: ◆低成本,小体积,符合 UL94-V0 阻燃标准 ◆安装方式采用国际标准 DIN35mm 导轨安装方式 ◆双隔离(信号输入、信号输出相互之间 3000VDC 隔离) ◆4-20mA 电流输入与输出,精度高(失真…

ansible部署安装Tomcat

我们需要用到的文件jdk以及tomcat安装包 下载链接:https://pan.baidu.com/s/1sjG8Yl8k-SUbOv7KwKXZMA 提取码:t71z 准备n台机器(我这里就简单部署三台机器) ansible的安装部署以及配置可以看博主之前的文章自动化运维工具-ansible部署 ansib…

zookeeper高级应用原理

文章目录 分布式锁分布式锁-读写锁分布式锁-Curator实现ZK集群管理 zookeeper 集群zookeeper 集群节点个数配置zookeeper 选举ZAB协议zookeeper 选举zookeeper 集群数据读写 分布式锁 分布式锁:在分布式环境下,保护跨进程、跨主机、跨网络的共享资源&am…

Day57力扣打卡

打卡记录 最小体力消耗路径 链接 Dijkstra 将Dijkstra算法从计算最短路径转化为计算路径最大差值。 class Solution:def minimumEffortPath(self, heights: List[List[int]]) -> int:n, m len(heights), len(heights[0])dist [0] [0x3f3f3f3f] * (n * m - 1)vis set…

iPhone 数据恢复:iMyFone D-Back iOS

iMyFone D-Back iOS 最佳 iPhone 数据恢复,最好的 iPhone 数据恢复软件,恢复成功率最高。 直接从iOS设备、iTunes/iCloud/第三方程序备份快速恢复数据。 有选择地恢复已删除的照片、WhatsApp、消息和 18 多种其他数据类型。 仅通过 iCloud 帐户访问即可从…

【组合数学】递推关系

目录 1. 递推关系建立2. 常系数齐次递推关系的求解3. 常系数非齐次递推关系的求解4. 迭代法 1. 递推关系建立 给定一个数的序列 f ( 0 ) , f ( 1 ) , . . . , f ( n ) , . . . , f (0), f(1), ..., f(n ),... , f(0),f(1),...,f(n),..., 若存在整数 n 0 n_0 n0​ &#xff…

启动jar包命令

一、Windows环境 找到jar包的位置; 按shift键,点击鼠标右键,选中在此处打开PowerShell窗口; 此时进入命令行工具 输入java -jar .\java_web-0.0.1-SNAPSHOT.jar(注意空格)。 二、Linux环境 2.1 方式一 …

【二者区别】cuda和cudatoolkit

Pytorch 使用不同版本的 cuda 由于课题的原因,笔者主要通过 Pytorch 框架进行深度学习相关的学习和实验。在运行和学习网络上的 Pytorch 应用代码的过程中,不少项目会标注作者在运行和实验时所使用的 Pytorch 和 cuda 版本信息。由于 Pytorch 和 cuda 版…

【JVM从入门到实战】(二)字节码文件的组成

一、Java虚拟机的组成 二、字节码文件的组成 字节码文件的组成 – 应用场景 字节码文件的组成部分-Magic魔数 什么是魔数? Java字节码文件中的魔数 文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件的内容。…

用23种设计模式打造一个cocos creator的游戏框架----(十三)模板方法模式

1、模式标准 模式名称:模板方法模式 模式分类:行为型 模式意图:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 结构图&#xff1a…

【ArcGIS Pro微课1000例】0053:基于SQL Server创建与启用地理数据库

之前的文章有讲述基于SQL Server创建企业级地理数据库,本文讲述在SQL Server中创建常规的关心数据库,然后在ArcGIS Pro中将其启用,转换为企业级地理数据库。 1. 在SQL Server中创建数据库** 打开SQL Server 2019,连接到数据库服务器。 展开数据库连接,在数据库上右键→新…

使用Android Studio的Gradle Tasks对源码生成jar包

一. 前言 As工具可以用来编译第三方源码(比如okhttp ,retrofit源码), 用于打jar包或aar包,使用工具自带的Tasks工具可以帮忙我们完成这些事情。 二. 遇到问题 Android Studio Gradle打包Tasks不显示,如图…

销售技巧培训之如何提升房地产销售技巧

在房地产销售这个竞争激烈的行业中,要想获得成功,不仅需要熟练掌握销售技巧,还需要不断地提升自己的能力。下面,我们将从以下几个方面探讨如何提升房地产销售技巧。 一、了解客户需求 倾听客户:在与客户沟通时&#x…

正运动ZDevelop软件使用流程

ZDevelop是正运动技术ZMoiton系列运动控制器的PC端程序开发调试与诊断软件,通过它用户能够很容易的对控制器进行程序编辑与配置,快速开发应用程序、实时诊断系统运行参数以及对运动控制器正在运行的程序进行实时调试,支持中英双语环境。 BAS…

Vue自定义指令插槽作用域插槽具名插槽

Vue自定义指令&插槽&作用域插槽&具名插槽 一、学习目标 1.自定义指令 基本语法(全局、局部注册)指令的值v-loading的指令封装 2.插槽 默认插槽具名插槽作用域插槽 3.综合案例:商品列表 MyTag组件封装MyTable组件封装 4.路…

Linux高级管理-基于域名的虚拟Web主机搭建

客服机限制地址 通过 Require 配置项&#xff0c;可以根据主机的主机名或P地址来决定是否允许客户端访问。在httpd服 务器的主配置文件的<Location>&#xff0c;<Directory>、<Files>、<Limit>配置段中均可以使用Require 配置 项来控制客户端的访问。使…