OpenCV学习 基础图像操作(十四):直方图均衡化和直方图规定化

news/2024/7/21 23:47:39/文章来源:https://blog.csdn.net/fan1102958151/article/details/115937208

基础原理

直方图操作是基于像素统计的基础图像操作,被广泛运用于调整图像的对比度,并由此衍生出很多变种和该经的方式.

图像相直方图

直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横坐标表示数据类型,纵轴表示分布情况。

图像直方图,常见的是指根据灰度来绘制灰度的直方图,当然我们也可以绘制RGB直方图,梯度直方图,方向直方图等等,简而言之就是通过直方图的形式来刻画图片的某一属性。

直方图均衡化

直方图均衡化顾名思义,是将分布不均衡的直方图变为均衡的,如下图所示,将左侧的直方图转换为右侧的直方图整个过程就称作直方图均衡化。

本质上是将分布不均匀的像素强度值,通过单调非线性函数的映射形成均匀的像素强度值分布。

其实现方式具体实现如下:

假设原图像为I_S目标图像为I_D,那么则有I_D=f(I_S)

其具体的计算过程如下:

  1. 统计图像的直方图信息,并划分到L-1层级上
  2. 针对每一层级,对统计的像素值进行归一化
  3. s的累积分布函数为
  4. 对tk取整扩展后

总结整个过程为:

直方图规定化

直方图均衡化能自动增强图像的整体对比度,但是往往结果难以受到控制。实际中常常需要增强某个特定灰度值范围内的对比度或使图像灰度值的分布满足特定需求。这个时候使用直方图规定化会有较好的结果。直方图规定化就是要调整原始图像的直方图去逼近规定的目标直方图

其具体的计算过程如下:

  1. 求出原始图像的直方图分布
  2. 求出目标图像的直方图分布
  3. 接下来就是如何建立原始灰度级数和规定直方图灰度级数的对应映射关系。映射规则一般有两种:单映射规则(SML)和组映射规则(GML)。
    单映射规则中,将k从小到大依次找到能使下式有最小值的l的值,这样就可以将原始图像灰度级数k和规定直方图灰度级数l对应映射起来。

    组映射规则中,设I(l)为整数函数,l=1,2,3,…,N-1,满足0I(0)≤I(l)≤…≤I(N-1)≤M-1。I(l)为不确定值,因此要确定能使下式达到最小的I(l)*值:

总结整个过程为:

自适应直方图均衡化

实际上“自适应”在这所指的是就是用滑动窗口来对局部的来做直方图均衡化,并且对这个局部区域内的对比度进行限制。

具体计算过程如下:

  1. 将图信息按窗口大小进行切分
  2. 在每个窗口内进行直方图均衡化

由于有局部噪声的存在,可能将局部的噪声放大,因此一般在使用自适应直方图均衡化时,常常会对其对比度进行一个限制,防止噪声过度放大,即在映射时添加限制,这种方法也称为对比度受限的自适应直方图均衡化。

API介绍

直方图统计

split(
const Mat &src, //输入图像
Mat* mvbegin //输出的多通道图像数组
)calcHist(
const Mat* image,//输入图像指针
int images_nums,//输入图像的数目
const int* channels,//输入图像的通道数
InputArray mask,    //输入mask,可选,默认不用
OutputArray hist,   //输出的直方图数据
int dims,           //输出数据的维度
const int* histsize,//直方图的级数(输出多少个条)
const float* ranges,//值域范围(横坐标的范围)
bool uniform,       //是否归标准化
bool accumulate     //是否累加,如果是多通道的则需要设为true,默认为false
)

直方图均衡化

equalizeHist(
InputArray src,//输入图像,必须是8-bit的单通道图像
OutputArray dst//输出结果
)

直方图规定化(直方图匹配)

equalizeHist
(
InputArray 	src, //原图像
OutputArray dst, //目标图像
Stream &stream = Stream::Null() //异步实时处理的流,通常不用
)

自适应直方图均衡化

//创建自适应均衡化器
createCLAHE	(   double 	clipLimit = 40.0,      //对比度限制大小Size 	tileGridSize = Size(8, 8) //滑窗大小)	//调用
CLAHE::apply(	InputArray 	src,     //原图像OutputArray dst      //目标图像)	

实践一下:

import cv2
import numpy as np
import matplotlib.pyplot as plt# 加载图像
image = cv2.imread('lena.png', cv2.IMREAD_GRAYSCALE)# 直方图均衡化
equalized = cv2.equalizeHist(image)# 自适应直方图均衡化
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
adaptive_equalized = clahe.apply(image)# 直方图匹配
def histogram_matching(source, template):oldshape = source.shapesource = source.ravel()template = template.ravel()s_values, bin_idx, s_counts = np.unique(source, return_inverse=True, return_counts=True)t_values, t_counts = np.unique(template, return_counts=True)s_quantiles = np.cumsum(s_counts).astype(np.float64)s_quantiles /= s_quantiles[-1]t_quantiles = np.cumsum(t_counts).astype(np.float64)t_quantiles /= t_quantiles[-1]interp_t_values = np.interp(s_quantiles, t_quantiles, t_values)return interp_t_values[bin_idx].reshape(oldshape)template_image = cv2.imread('shan.jpeg', cv2.IMREAD_GRAYSCALE)
matched = histogram_matching(image, template_image)# 显示结果
plt.figure(figsize=(10, 8))plt.subplot(2, 3, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')plt.subplot(2, 3, 2)
plt.title('Histogram Equalized')
plt.imshow(equalized, cmap='gray')plt.subplot(2, 3, 4)
plt.title('Adaptive Histogram Equalized')
plt.imshow(adaptive_equalized, cmap='gray')plt.subplot(2, 3, 5)
plt.title('Histogram Matched')
plt.imshow(matched, cmap='gray')plt.subplot(2, 3, 3)
plt.title('Source')
plt.imshow(image, cmap='gray')plt.subplot(2, 3, 6)
plt.title('Template')
plt.imshow(template_image, cmap='gray')plt.tight_layout()
plt.show()

参考链接

直方图均衡化、自适应直方图均衡化_直方图均衡化和自适应均衡化的区别-CSDN博客

限制对比度自适应直方图均衡化算法原理、实现及效果-CSDN博客

直方图均衡化以及直方图匹配_自适应直方图均衡化比直方图均衡化好在哪里-CSDN博客

OpenCV--021:直方图规定化_opencv 直方图规定化-CSDN博客

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

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

相关文章

GPT-4o和GPT-4有什么区别?我们还需要付费开通GPT-4?

GPT-4o 是 OpenAI 最新推出的大模型,有它的独特之处。那么GPT-4o 与 GPT-4 之间的主要区别具体有哪些呢?今天我们就来聊聊这个问题。 目前来看,主要是下面几个差异。 响应速度 GPT-4o 的一个显著优势是其处理速度。它能够更快地回应用户的查…

gin框架精通篇(二)

原生数据库使用 导入模块:go get -u github.com/go-sql-driver/mysql 安装 mysql 数据库 安装数据库可能遇到的问题:(网上的方法基本可以解决) ERROR 1045 (28000): Access denied for user ‘-root’‘localhost’ (using passwo…

模拟量4~20mA电流传感器接线方式

一、模拟量4~20mA电流传感器接线方式 无源双线制是常见的电流型传感器接线方式,它具有简单、经济的特点。其接线方式如下: 传感器的“”接到数据采集器的电源“”上, 传感器的“-”端子连接到数据采集器的“AI”端子上, 数据采集器…

深入分析C#中的“编写器”概念——代码修改、注解与重构

文章目录 1. 编写器(Writer)的概念2. 编写器的作用和工作原理3. 编写器的重要性4. 写入器常用方法5. 写入器示例6. 编写器示例——使用Fody进行代码注解和重构7. 总结 在软件开发过程中,代码的维护和更新是至关重要的。C#作为一种流行的编程语…

【RK3288 Android10 T8pro usb hid-multitouch idc配置】

【RK3288 Android10 T8pro usb hid-multitouch idc配置】 文章目录 【RK3288 Android10 T8pro usb hid-multitouch idc配置】背景代码分析1. 读取配置文件2. 标志内外置屏幕3. 设置输入设备4. findviewport()5. 根据对应的viewport来计算相应的mapping的参数 结论 背景 T8pro …

护网2024-攻防对抗解决方案思路

一、护网行动简介 近年来,网络安全已被国家上升为国家安全的战略层面,网络安全同样也被视为维护企业业务持续性的关键。国家在网络安全治理方面不断出台法规与制度,并实施了一些大型项目和计划,如网络安全法、等级保护、网络安全…

【NumPy】NumPy线性代数模块详解:掌握numpy.linalg的核心功能

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

HQChart使用教程99-K线窗口设置上下间距

HQChart使用教程99-K线窗口设置上下预留间距 指标窗口布局说明设置预留间距数据结构通过Setoption设置通过ChangeIndex设置 HQChart代码地址 指标窗口布局说明 顶部预留间距(3)和底部预留间距(5) 这个部分是算在Y轴坐标上的 设置预留间距 数据结构 HorizontalReserved&#…

【Qt QML】Dialog组件

带有标准按钮和标题的弹出对话框,用于与用户进行短期交互。 这个描述指的是一个常见的用户界面元素,即一个临时弹出的窗口(或对话框),它包含一个标题,显示对话框的用途或内容描述,以及一系列标…

[最新]CentOS7设置开机自启动Hadoop集群

安装好Hadoop后我们可以使用开机自启动的方式,节约敲命令的时间。注意是centOS7版本!!!和centOS6版本区别非常大!!! 1、切换到系统目录 [rootmaster ~]# cd /etc/systemd [rootmaster systemd]# ll total 32 -rw-r--r-- 1 root root 720 Jun 30 23:11 bootcha…

家用洗地机哪个品牌好?家用洗地机排行榜前十名

随着洗地机逐渐进入大众视野,这种集吸、拖、洗功能于一体的清洁工具,凭借其高效便捷的特点,成为家庭清洁的新宠。洗地机不仅能够减少地面清洁时间,节省体力,还能提高清洁效果。然而,面对琳琅满目的洗地机品…

MyBatis中的Where标签:提升你的SQL查询效率

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 理解MyBatis的Where标签 MyBatis是一款优秀的持久层框架&#xff0c;它提供了许多强大的标签来帮助编写更优雅、高效的SQL语句。其中&#xff0c;<where>标签是使用频率极高的一个&#xff0c;它能够自动处理…

代码随想录算法训练营第36期DAY35

DAY35 122买卖股票的最佳时机ii 很巧妙&#xff0c;也很难想到&#xff1a;计算每天的利润&#xff08;今天卖出&#xff0c;昨天买入的利润&#xff09;&#xff0c;只取正数相加。 class Solution {public: int maxProfit(vector<int>& prices) { int…

JAVA云HIS医院系统源码 云HIS运维平台源码 融合B/S版电子病历系统,支持电子病历四级,saas模式

JAVA云HIS医院系统源码 云HIS运维平台源码 融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;saas模式 HIS系统就是医院信息管理系统&#xff0c;HIS系统是整个医院信息化的核心&#xff0c;门诊、住院、药房、药库等都是由HIS系统来承载起来的&#xff0c;所以…

【MATLAB源码-第215期】基于matlab的8PSK调制CMA均衡和RLS-CMA均衡对比仿真,对比星座图和ISI。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 CMA算法&#xff08;恒模算法&#xff09; CMA&#xff08;Constant Modulus Algorithm&#xff0c;恒模算法&#xff09;是一种自适应盲均衡算法&#xff0c;主要用于消除信道对信号的码间干扰&#xff08;ISI&#xff09;…

package.json中peerDependencies的使用场景

文章目录 peerDependencies 的使用场景peerDependencies 的使用案例为什么使用 peerDependencies需要注意的事项主要作用 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xf…

python中的空语句以及对于条件语句的总结

if条件&#xff1a; 代码块 if条件&#xff1a; 代码块1 else&#xff1a; 代码块2 if条件1&#xff1a; 代码块1 elif条件2&#xff1a; 代码块2 else&#xff1a; 代码块3

【class18】人工智能初步----语音识别(4)

【class17】 上节课&#xff0c;我们学习了: 语音端点检测的相关概念&#xff0c;并通过代码切分和保存了音频。 本节课&#xff0c;我们将学习这些知识点&#xff1a;1. 序列到序列模型2. 循环神经网络3. 调用短语音识别接口 知其然&#xff0c;知其所以然 在调用语…

【最新更新】上市公司-全要素生产率(1999-2023年)(数据+5种方法测算)

上市公司的全要素生产率是指在一定时期内&#xff0c;上市公司通过使用各种生产要素(包括资本、劳动力、技术等)所创造的价值。它是衡量上市公司经营绩效的重要指标之一&#xff0c;可以反映出公司的生产效率和创新能力。全要素生产率的计算方法有很多种&#xff0c;其中最常见…

Springboot项目——博客平台

前言&#xff1a;为巩固之前学习的知识&#xff0c;同时锻炼自己的代码能力&#xff0c;项目经验&#xff0c;熟悉前后端交互方式等&#xff0c;特此完成一个博客平台系统。&#xff08;总之&#xff0c;为了学习&#xff0c;为了进步&#xff09; 博客平台&#xff1a;本项目…