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

基础原理

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

图像相直方图

直方图(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.mzph.cn/pingmian/17679.shtml

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

相关文章

【强训笔记】day24

NO.1 思路:递归。 代码实现: class Solution { public:bool IsBalanced_Solution(TreeNode* pRoot) {return dfs(pRoot)!-1;}int dfs(TreeNode* root){if(rootnullptr) return 0;int leftdfs(root->left);if(left-1) return -1;int rightdfs(root-…

Vulnhub - AI-WEB-1.0靶机教程

目录 站点信息收集 c段扫描 端口扫描 目录扫描 漏洞利用 使用 burp 抓包 查询数据库名 查询数据库下的表 查询表中的字段名 查询字段中的数据 --os-shell 上传一句话木马 下载地址:https://download.vulnhub.com/aiweb/AI-Web-1.0.7z 我们从站点信息收…

【哈希】闭散列的线性探测和开散列的哈希桶解决哈希冲突(C++两种方法模拟实现哈希表)(1)

🎉博主首页: 有趣的中国人 🎉专栏首页: C进阶 🎉其它专栏: C初阶 | Linux | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 哈希函数与哈希 之 闭散列的线性探测解决哈希冲突 的相关内容。 如…

Echarts圆环图偏移后 中心文字居中对齐实现

像上图中这样圆环图并不在div的中间时,中心的文本需要居中展示 一开始用left百分比但数据一旦变长或变短就会偏移 像这样 实在是太不美观了 所以我们这里使用动态的left通过文本的长度来计算 /*** 计算文本宽度* param {String|Number} text* param {String} font*…

js之图片上传

话不多说&#xff0c;直接上干货&#xff0c;注释在代码里面 下面是效果图和代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

[算法][数字][leetcode]2769.找出最大的可达成数字

题目地址 https://leetcode.cn/problems/find-the-maximum-achievable-number/description/ 题目描述 实现代码 class Solution {public int theMaximumAchievableX(int num, int t) {return num2*t;} }

第97天:权限提升-Web 权限权限划分源码后台中间件第三方数据库等

前置知识 具体有哪些权限需要我们了解掌握的 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 以上常见权限获取方法简要归类说明 后台权限&#xff1a;SQL 注入,数据库备份泄露&#xff0c;默认或弱口…

Python | Leetcode Python题解之第104题二叉树的最大深度

题目&#xff1a; 题解&#xff1a; class Solution:def maxDepth(self, root: TreeNode) -> int:if not root: return 0queue, res [root], 0while queue:tmp []for node in queue:if node.left: tmp.append(node.left)if node.right: tmp.append(node.right)queue tmp…

Mybatis入门——其他查询操作和数据库连接池(4)

目录 一、多表查询 二、#{} 和 ${} 1、#{} 和 ${} 的使用 &#xff08;1&#xff09;Integer类型的参数 #{} 的使用 ${} 的使用 &#xff08;2&#xff09;使用String类型的参数 #{} 的使用 ${} 的使用 小结&#xff1a; 2、#{} 和 ${} 的区别 &#xff08;1&#…

太阳能语音监控杆(球机LED款)有什么用

传统监控设备依赖电力支持&#xff0c;在偏远地区和没有网络地区难以发挥其作用&#xff0c;而鼎跃安全的太阳能语音监控杆&#xff08;球机LED款&#xff09;在传统监控基础上&#xff0c;进行了全面优化&#xff0c;解决了无电无网区域使用受限的问题。 太阳能语音监控杆&am…

RSC英国皇家化学学会文献查找下载

英国皇家化学学会(Royal Society of Chemistry&#xff0c;简称RSC)是以促进全球化学领域研究发展与传播为宗旨的国际权威学术机构&#xff0c;是化学信息的一个重要宣传机关和出版商。RSC出版的期刊是化学领域的核心期刊&#xff0c;大部分被SCI和MEDLINE收录&#xff0c;如An…

腾讯云联络中心ivr调用自定义接口

1&#xff0c;java代码&#xff1a;http接口 RequestMapping(value "/getMsg5", method RequestMethod.POST) public Map<String, String> index(RequestBody Map<String, String> params) {String id params.get("id");HashMap<String…

渗透测试工具Cobalt strike-1.CS介绍与配置

Cobalt Strike是一款美国Red Team开发的渗透测试神器&#xff0c;常被业界人称为CS。最近这个工具大火&#xff0c;成为了渗透测试中不可缺少的利器。其拥有多种协议主机上线方式&#xff0c;集成了提权&#xff0c;凭据导出&#xff0c;端口转发&#xff0c;socket代理&#x…

目前无法解释的6个物理问题,每一个都困扰科学家很长时间

人类已经对宇宙有了大概的认知&#xff0c;不过即便如此&#xff0c;在宇宙中还有很多我们无法解释的物理问题&#xff0c;下面我们就一起来看看。 第一个无法解释的物理问题——虫洞真的存在吗&#xff1f; 虫洞最早是1916年由奥地利物理学家路德维希.费莱姆首次提出的&#…

登录记住密码背景颜色修改

1&#xff0c;在login.vue中&:-webkit-autofill里面的css替换成如下 &:-webkit-autofill {box-shadow: 0 0 0px 1000px $bg inset !important;-webkit-text-fill-color: $cursor !important;}

【自用题库】2024/华三/H3CNE安全GB0-510

【网工必备】华三H3CNE-安全-510 题库覆盖百分百&#xff0c;题库有291道总结汇总 还有vce加vce文件模拟真实考试环境 到手文件夹5样东西&#xff01;&#xff01;&#xff01; 认证简介&#xff1a;H3CNE-Security&#xff08;H3C Certified Network Engineer For Security&am…

6千古诗文必背名句大全ACCESS\EXCEL数据库

古诗&#xff0c;是古代诗歌的一种体裁&#xff0c;又称古体诗或古风&#xff0c;指的是产生于唐代以前并和唐代新出现的近体诗&#xff08;又名今体诗&#xff09;相对的一种诗歌体裁。其特点是格律限制不太严格。 从小我们就被教“熟读唐诗三百首,不会吟诗也会吟”&#xff…

Ubuntu20.04安装ffmpeg,并捕获视频流

工控机&#xff1a;幻影峡谷 系统&#xff1a;Ubuntu20.04 摄像头&#xff1a;杰瑞微通环星光USB摄像头 安装ffmpeg步骤 依次运行以下命令&#xff1a; sudo apt update sudo apt install ffmpeg安装完成后&#xff0c;通过运行ffmpeg -version来验证安装是否成功&#xf…

Postgresql源码(134)优化器针对volatile函数的排序优化分析

相关 《Postgresql源码&#xff08;133&#xff09;优化器动态规划生成连接路径的实例分析》 上一篇对路径的生成进行了分析&#xff0c;通过make_one_rel最终拿到了一个带着路径的RelOptInfo。本篇针对带volatile函数的排序场景继续分析subquery_planner的后续流程。 subquer…

SAM遥感图像处理开源新SOTA!在GPU上实现40倍加速,不损准确性

在遥感图像处理领域&#xff0c;通过SAM捕捉复杂图像特征和细微差异&#xff0c;可以实现高精度的图像分割&#xff0c;提升遥感数据的处理效率。这种高度的准确性让SAM遥感展现出了比传统方法更优越的性能。 不仅如此&#xff0c;这种策略灵活普适的特性还能拓展遥感技术的应…