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

news2024/10/7 8:30:11

基础原理

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

图像相直方图

直方图(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.shape
    source = 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.coloradmin.cn/o/1707318.html

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

相关文章

美业系统SaaS收银系统源码-顾客在系统付款了但系统未显示怎么办?美业系统实测

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 活动促销 PC管理后台、手机APP、iPad APP、微信小程序 1. 提供门店名称、付款凭证和会员手机号 2. 到订单明细查询, 按门店名称和会员手机号查询看是否有相…

高工咨询:《2024中国人形机器人产业发展蓝皮书》

高工咨询所发布的《2024中国人形机器人产业发展蓝皮书》全面梳理了人形机器人产业的发展现状、政策环境、资本市场、技术发展、市场前景以及面临的机遇与挑战等情况。 人形机器人是当今世界科技领域最具潜力和前景的产业之一。随着科技的不断进步和人 工智能技术的快速发展&…

轻松拿捏C语言——二分查找

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 🌈感谢大家的阅读、点赞、收藏和关注💕 目录🎉 一、介绍🌈 二、步骤🌙 三、代码☀️ 一、介绍 二分查找是一种在有序数组中…

DINO中为什么教师模型用大图,学生模型用小图

在 DINO(可以理解为由DIstillation和NO labels的缩写)中,使用不同的图像裁剪策略对教师模型和学生模型进行训练有其特定的原因。具体来说,教师模型使用大图(global views),学生模型则同时使用大…

二十三篇:未来数据库革新:AI与云原生的融合之旅

未来数据库革新:AI与云原生的融合之旅 1. 智能数据库管理:AI的魔法 在数字化时代,数据库技术作为信息管理的核心,正经历着前所未有的变革。AI(人工智能)和云原生技术的融合,正在重新定义数据库…

Dubbo生态之深度分析sentinel的流量控制

1. 深度了解sentinel限流规则参数的含义 博客Dubbo生态之sentinel限流-CSDN博客中有dubbo集成sentinel的demo演示 在sentinel中,限流的直接表现形式就是,在执行Entry nodeA SphU.entry(resourceName)的时候抛出FlowException异常,FlowExce…

元宇宙vr科普馆场景制作引领行业潮流

在这个数字化高速发展的时代,北京3D元宇宙场景在线制作以其独特的优势,成为了行业内的创新引领者。它能够快速完成空间设计,根据您的个性化需求,轻松设置布局、灯光、音效以及互动元素等,为您打造出一个更加真实、丰富…

su模型导进3D无法炸开和移动?---模大狮模型网

SketchUp(简称SU)作为一款广受欢迎的3D建模软件,其直观的操作界面和丰富的功能深受用户喜爱。然而,当我们将SU模型导入到其他3D软件(如3ds Max、Maya等)时,有时会遇到模型无法炸开(即分解)和移动的问题。这不仅影响了我们的工作效率&#xff…

Mesa GL Dispatch分发分析与理解

Mesa GL Dispatch分发分析与理解 引言 这篇博客的核心是从OpenGL应用程序的典型api入手,分析gl api 调用到用户态驱动后端的过程,进而总结出一个典型的调用栈。理解了这个典型调用栈,对后续任何一个API的调用过程分析,都是a piec…

618有哪些值得买的好物?这几款好物通宵整理吐血推荐!

随着618购物节越来越近,很多买家终于等到了用好价钱买好东西的好机会。不管是你一直想要的家居电器,还是最新的数码产品,平时挺贵的东西在618期间会便宜不少。不过,这么多东西可选,促销活动也多得让人看花了眼&#xf…

实现echarts多图联动效果

实现echarts多图联动效果 文章目录 实现echarts多图联动效果业务场景实现关键api代码示例(vue) 业务场景 提示:主要是记录一下多个echarts联动效果实现方案 这本来就是echarts本身自带的api,并没有多高级,奈何寻找的过…

VUE3学习第一篇:启动ruoyi

1、找到ruoyi的vue3版本 然后下载代码到本地, 我刚开始用的nodejs14报错, 后面换成nodejs16,启动前端成功了。 页面如下图所示

用大模型搭建一个自己的新闻小助手

背景 信息快速增长的时代,及时获取到有价值的资讯是一件很必要的事情。已经有各类新闻app和获取信息的渠道了,为什么还需要在构建一个小助手来获取新闻资讯呢?其实原因很简单各类新闻app服务的是具体一类人群,个人和人群还是有偏…

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

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

13 VUE学习:组件v-model

基本用法 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 [defineModel()]宏&#xff1a; <!-- Child.vue --> <script setup> const model defineModel()function update() {model.value } </script><te…

还在使用Swagger吗?ApifoxHelper插件隆重登场

目录 前言 安装Apifox Idea插件安装 插件令牌配置 获取令牌 Idea配置令牌 快速上手 同步文档 查看文档 结语&#xff1a; 前言 最近发现一款特别好用的插件&#xff0c;帮助开发者快速生成接口文档。ApifoxHelper插件实现代码零侵入&#xff0c;只需要写上相应注释即可…

切勿安装这五款流氓软件,你中招了没

流氓软件&#xff0c;又称为恶意软件&#xff0c;是一类设计用来损害用户设备、窃取信息或干扰正常使用的程序。以下是五款臭名昭著的流氓软件介绍&#xff0c;提醒切勿安装&#xff0c;只能说一个比一个毒&#xff0c;你中招了没 可以去去虚拟机试试谁的毒更强一些&#xff0…

信息化教推动数字化学校建设

在数字化学校建造的过程中&#xff0c;许多学校都疏忽了运用这些网络科技渠道的教师和学生&#xff0c;一味的追求学校数字化、智能化建造&#xff0c;没有从根本上意识到教育信息化的出现者或者说体现者的重要性&#xff0c;因而&#xff0c;建造数字化学校&#xff0c;前进教…

Genzai:一款针对物联网安全的多功能实用性工具套件

关于Genzai Genzai是一款针对物联网安全的多功能实用性工具套件&#xff0c;该工具旨在识别与物联网相关的仪表盘&#xff0c;并扫描它们以查找默认密码和安全问题&#xff0c;广大研究人员可以使用该工具来检测和提升物联网设备的安全性。 Genzai支持用户以输入的形式提供一个…

【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 …