【OpenCV C++20 学习笔记】直方图均衡化-Histogram Equalization

news2024/9/21 4:37:47

直方图均衡化-Histogram Equalization

  • 原理
    • 图片的直方图
    • 直方图均衡化
    • 实现方法
  • API
  • 示例

原理

图片的直方图

直方图的横坐标是图片的强度值(颜色值),纵坐标是每个强度值对应的像素的个数;因此坐标系上的每个方形图就代表了整张图片中其强度值等于该方形图对应强度值的像素的频数。
如下图,居于黑白之间的灰色最多,所以直方图横坐标的中间位置对应的像素数量越多:
图片强度直方图

直方图均衡化

直方图均衡化是指一种提高图片对比度的方法。
拿上面的图来举例子。直方图均衡化就是将中间强度值最集中的部分拉宽,如下图所示。绿色圈内的部分是频数较低的颜色值区域。在应用均衡化之后,直方图变成中间的样子,而原图也变成了右边的样子:
直方图均衡化

实现方法

均衡化的方法可以看成将一个分布(原有直方图)映射成另一种分布(均衡化后的直方图),从而使得强度值在整个值域内均衡分布。
要实现直方图均衡化,重映射方法应该是一个累积分布函数(cumulative distribution function, cdf)。比如,直方图 H ( i ) H(i) H(i)的累计分布函数 H ′ ( i ) H'(i) H(i)是:
H ′ ( i ) = ∑ 0 ≤ j < i H ( j ) H'(i)=\sum_{0 \leq j < i}H(j) H(i)=0j<iH(j)
上例中的直方图的累积分布函数的图像如下:
累计分布函数
另外还要对 H ′ ( i ) H'(i) H(i)进行归一化,使其最大值为255(或者为图片强度值的最大值)。经过归一化之后,频率相近的强度值会被转换成相同的值,这样就实现了一个更均衡的分布。累积分布图也变成了均衡直方图,即均衡化后的效果。
因此,均衡化的过程可以概括为:
e q u a l i z e d ( x , y ) ) = H ′ ( s r c ( x , y ) ) equalized(x,y))=H'(src(x,y)) equalized(x,y)=H(src(x,y))

API

在OpenCV中,有专门进行直方图均衡化的函数equalizeHist(),其原型如下:

void cv::equalizedHist(	InputArray 	src,
						OutputArray	sdt,)
  • 原图必须是8位单通道的图片,即灰度图片
  • 输出图与原图具有相同的尺寸和类型

示例

本示例将著名的lena.jpg先转换成灰度图片,然后进行均衡化操作,代码如下:

#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;

int main() {
	Mat src{ imread("lena.jpg") };

	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	Mat dst;
	equalizeHist(gray, dst);

	imshow("灰度图", gray);
	imshow("均衡化", dst);
	waitKey(0);
}

运行结果如下(左边为原始灰度图,右边为均衡化后的效果):
灰度图均衡化

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

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

相关文章

IDEA 生成类的注释信息

新建任意类&#xff0c;自动生成注释信息&#xff08;选其一&#xff0c;否则会多出一份注释信息&#xff09; 打开File -> Settings -> Editor -> File and Code Templates -> Includes&#xff0c;在File Header中添加如下信息&#xff0c;然后点击OK即可 /** *…

【数据结构与算法 | 力扣+二叉搜索树篇】力扣938,1008

1. 力扣938&#xff1a;二叉搜索树的范围和 1.1 题目&#xff1a; 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 输出&#xff1a;32示…

从原理到实践,GraphRAG 如何提升 LLM 的摘要总结能力?

作者介绍&#xff1a;王振亚&#xff0c;蚂蚁大安全技术部技术专家 GraphRAG 是一种基于知识图谱的检索增强生成方法。微软在7月初开源了 GraphRAG 项目&#xff0c;一个月左右的时间内&#xff0c;它已经获得了 13k 的 stars。 相对于通常的 RAG &#xff0c;GraphRAG 在从多…

HTTPS是怎么建⽴连接的(通俗易懂版)

首先了解HTTPS的构造&#xff0c;如下图所示&#xff1a; SSL/TLS 协议基本流程&#xff1a; 客户端向服务器索要并验证服务器的公钥。 双⽅协商⽣产「会话秘钥」。 双⽅采⽤「会话秘钥」进⾏加密通信。 HTTPS建立连接的具体流程如下&#xff1a; ⾸先&#xff0c;客户端向…

电商产品摄影福音!AI绘画 ComfyUI 产品摄影工作流 (自定义产品位置并保留细节),再也不用请摄影师了!

大家好&#xff0c;我是画画的小强 今天&#xff0c;我将介绍一个最新开发的 AI绘画 的产品摄影ComfyUI工作流。只需要提供一张产品图片&#xff0c;然后用提示词描述你想要的画面&#xff0c;就可以生成一张效果非常自然的产品摄影图片。 本次教程所用到的工作流我已经准备好…

一机两用的简单介绍

电子政务外网终端使用过程的风险与挑战 1、终端防护弱&#xff0c;失陷风险大 政务外网终端具备访问互联网能力&#xff0c;造成政务外网终端极易感染僵木蠕病毒&#xff0c;破坏正常办公 政务外网终端易被攻击失陷&#xff0c;成为从互联网攻击政务外网的跳板机 2、VPN漏洞…

资源覆盖机制在安卓中的应用

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 什么是资源覆盖&#xff08;Resource Overlay&#xff09;&#xff1f; 资源覆盖的分类 静态资源覆盖&#xff08;SRO&#…

linux crontab没有按照规则执行排查

配置了cron规则&#xff0c;但是一段时间后任务没有按预期执行&#xff0c;记录一次修复过程 检查crond服务 systemctl status crond规则正常 crontab -l脚本有执行权限 查看日志 第一种&#xff1a;journalctl journalctl -u crond | grep 03:00 -C 3-u 指定crond.serv…

【小塔 | 解锁时尚行业RFID魅力值】

从奢侈品牌到快时尚&#xff0c;越来越多的时尚品牌开始选择RFID技术&#xff0c;RFID标签与货品结合到一起&#xff0c;在客户体验、货品溯源、货品防伪、货品调度、库存盘点等方面做到了极致。 大众熟知的迪卡侬、耐克、阿迪达斯、Zara、优衣库、海澜之家等品牌早在前几年就已…

Python06:分支结构if else

分支结构: 代码中有多条执行路径&#xff0c;但是只有其中一条会被执行 """ eg03 - 分支结构&#xff08;选择结构&#xff09;的例子 代码中有多条执行路径&#xff0c;但是只有其中一条会被执行 admin Admin123!! Author: mimo_yy Date: 2024/5/14 "&qu…

安装TrinityCore wow服务器注册管理软件WoWSimpleRegistration-2:解决图片显示和多区问题

WoWSimpleRegistration官网&#xff1a; GitHub - masterking32/WoWSimpleRegistration: Simple Registration page for TrinityCore/AzerothCore/AshamaneCore/CMangos WoWSimpleRegistration支持TrinityCore和AzerothCore&#xff0c;安装方法见&#xff1a;Nginx配置php起…

【C++】优先级队列(容器适配器)

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 string vector list 这种线性结构是最基础的存储结构&#xff0c;C&#xff08;STL&#xff09;container很好的帮助我们数据存储的问题。 容器适配器 介绍 容器适配器是C标准模板库&#xff08;STL&#xff09;中…

sqllabs游戏

文章目录 总体思路&#xff1a;less-1:less-2:less-3:less-4:less-5:less-6:less-7:less-8:布尔盲注less-9:时间盲注less-21:less-24: 总体思路&#xff1a; 1、第一件事情 逃脱出单引号的控制 闭合单引号 2、单双引号需要成对出现 在python php Java中 3、2个办法 继续把多出…

linux文件命令:更新文件时间戳的工具touch详解

目录 一、概述 二. touch 命令的基本用途 三. touch 命令的语法 3.1、语法 3.2、touch 命令的选项 3.3、时间字符串格式 四. 常用场景 4.1 创建空文件 4.2 同时创建多个文件 4.3 更新文件的时间戳 4.4 只更新访问时间 4.5 只更新修改时间 4.6 设置特定时间戳 4.7 使用另…

入职一年半,这个AI员工晋升为了国内首位AI架构师

你敢想&#xff0c;AI 已经不满足只做程序员了&#xff0c;如今又向架构师这一进阶职业发起挑战。 随着 AI 在研发领域的不断进化&#xff0c;能提供给工程师的助力越来越多&#xff0c;从原先单纯的编码加速器不断延展到架构理解、质量分析、安全扫描、测试生成等更多领域。同…

9.1 迭装饰器的定义与使用:给你的 Python 代码加点“魔法”

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

JDBC在java代码中的使用

声明 对于数据库的增删改查&#xff0c;在使用jdbc的过程中分二类&#xff0c;查&#xff08;DQL&#xff09;语句和增&#xff0c;删&#xff0c;改&#xff08;DML语句&#xff09; 他们的整体都分为以下五部分&#xff0c;只是DQL语句多了数据的处理部分。 在使用之前需要…

首屏优化之:import 动态导入

前言 前面我们聊过可以通过不太的 script 属性比如 defer&#xff0c;async 来实现不同的加载效果&#xff0c;从而实现首屏优化&#xff0c;没看的朋友可以看一下&#xff1a;。 今天我们来聊一下动态导入之 import&#xff0c;当然 import 动态导入也不是一把梭的&#xff…

我们需要提高人工智能产品经理的标准

如何停止指责“模型”并开始构建成功的人工智能产品 产品经理负责决定开发什么&#xff0c;并对决策结果负责。这适用于所有类型的产品&#xff0c;包括由人工智能驱动的产品。然而&#xff0c;在过去十年中&#xff0c;产品经理将人工智能模型视为黑匣子是一种常见做法&#x…

如何在 CI/CD 过程中实施高效的自动化测试和部署

文章目录 摘要引言选择适合的 CI/CD 工具常见 CI/CD 工具选择依据 配置自动化构建和测试流程Jenkins示例 制定测试策略单元测试集成测试系统测试 确保部署环境的稳定性蓝绿部署 未来展望总结参考资料 摘要 在持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&…