【Emgu CV教程】7.3、图像锐化之手搓代码实现直方图均衡化

news2024/9/22 10:05:52

文章目录

  • 一、介绍
    • 1.写在前面
    • 2.彩色图像直方图均衡化函数
  • 二、举例


一、介绍

1.写在前面

上一篇文章介绍的是直方图均衡化,使用Emgu CV的EqualizeHist()函数。它对于背景和前景都太亮或者太暗的图像非常有用,而且计算速度非常快,简单又好用。但是存在一个缺点:EqualizeHist()函数的输出结果是8位单通道的灰度图,如果我们输入图像是一个彩色图像,先要转灰度图,再传入EqualizeHist()函数,最后得到一个锐化后的新灰度图。

怎么样能够将彩色图像经过直方图均衡化,得到的结果也是彩色图像呢?Emgu CV没有这个函数,但是伟大的CSDN上面有专家高手啊。这不,介绍的文章它就来了:

直方图均衡化算法原理与c++实现

作者是 小武~~ ,利用C++配合OpenCV完成,代码的原理我看了半天也没看懂,说是涉及到了概率论的知识,可惜大学时期学的概率论在n年前就忘了,不过不影响我把它转换为可以正常运行的C#程序。

1、感谢原作者 小武~~ 提供的代码和思路。
2、这只是代码的演示,如果涉及到侵权行为,可以联系我删除这篇文章。代码及程序思路是否可以用于商业行为,我也不清楚。不建议读者们直接拿过来并应用到商业项目中。

2.彩色图像直方图均衡化函数

C#代码如下:

        /// <summary>
        /// 彩色图像直方图均衡化函数.
        /// </summary>
        /// <param name="inputMat">输入的图像,三通道彩色图像.</param>
        /// <returns>直方图均衡化后的图像,也是三通道彩色图像.</returns>
        private Mat HistogramEqualization(Mat inputMat)
        {
            Mat dst = inputMat.Clone();
            int rows = inputMat.Rows; // 输入图像行数
            int cols = inputMat.Cols; // 输入图像列数
            int totalNum = rows * cols; // 输入图像总像素数

            Image<Bgr, int> imgSrc = inputMat.ToImage<Bgr, int>();
            int[] blueChannel = new int[256];
            int[] greenChannel = new int[256];
            int[] redChannel = new int[256];
            for (int i = 0; i < 256; ++i)
            {
                blueChannel[i] = 0;
                greenChannel[i] = 0;
                redChannel[i] = 0;
            }
            
            for (int i = 0; i < rows; ++i)
            {
                for (int j = 0; j < cols; ++j)
                {
                    blueChannel[imgSrc.Data[i, j, 0]]++;
                    greenChannel[imgSrc.Data[i, j, 1]]++;
                    redChannel[imgSrc.Data[i, j, 2]]++;
                }
            }

            // 计算分布函数
            int[] lutBlue = new int[256];
            int[] lutGreen = new int[256];
            int[] lutRed = new int[256];
            int sumBlue = 0, sumGreen = 0, sumRed = 0;
            for (int k = 0; k < 256; k++)
            {
                sumBlue += blueChannel[k];
                sumGreen += greenChannel[k];
                sumRed += redChannel[k];
                lutBlue[k] = 255 * sumBlue / totalNum;
                lutGreen[k] = 255 * sumGreen / totalNum;
                lutRed[k] = 255 * sumRed / totalNum;
            }

            // 灰度变换(赋值)
            Image<Bgr, int> imgDst = dst.ToImage<Bgr, int>();
            for (int i = 0; i < rows; ++i)
            {
                for (int j = 0; j < cols; ++j)
                {
                    imgDst.Data[i, j, 0] = lutBlue[imgSrc.Data[i, j, 0]];
                    imgDst.Data[i, j, 1] = lutGreen[imgSrc.Data[i, j, 1]];
                    imgDst.Data[i, j, 2] = lutRed[imgSrc.Data[i, j, 2]];
                }
            }

            dst = imgDst.Mat;
            dst.ConvertTo(dst, DepthType.Cv8U);
            return dst;
        }

二、举例

原始素材定义为srcMat,如下:
在这里插入图片描述
还是这个电影里的镜头,执行

Mat dstMat = HistogramEqualization(srcMat);

看一下效果,不光由黑夜变白天,还由黑白变彩色,真厉害,再次感谢原始作者 小武~~

在这里插入图片描述


原创不易,请勿抄袭。共同进步,相互学习。

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

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

相关文章

NXP实战笔记(七):S32K3xx基于RTD-SDK在S32DS上配置ICU输入捕获

目录 1、概述 2、输入捕获SDK配置 2.1、SAIC中断方式 2.2、IPWM或者IPM 1、概述 输入捕获&#xff0c;可以抓取高电平时间、低电平时间、占空比、周期、边沿检测与回调函数、边沿计数&#xff08;ABZ解码&#xff09;、时间戳、唤醒中断。 记录一下根据Emios模块实现上述部分…

论文精读--word2vec

word2vec从大量文本语料中以无监督方式学习语义知识&#xff0c;是用来生成词向量的工具 把文本分散嵌入到另一个离散空间&#xff0c;称作分布式表示&#xff0c;又称为词嵌入&#xff08;word embedding&#xff09;或词向量 Abstract We propose two novel model architec…

LeetCode 热题 100 | 二叉树(终)

目录 1 二叉树小结 1.1 模式一 1.2 模式二 2 236. 二叉树的最近公共祖先 3 124. 二叉树中的最大路径和 菜鸟做题&#xff08;返校版&#xff09;&#xff0c;语言是 C 1 二叉树小结 菜鸟碎碎念 通过对二叉树的练习&#xff0c;我对 “递归” 有了一些肤浅的理解。…

适用于 Windows 10、11 的 5 款最佳免费文件恢复软件

最好的免费文件恢复软件是什么&#xff1f; 如今&#xff0c;人们通常将数据保存在硬盘或云备份上。除此之外&#xff0c;您还可以将重要数据存储在 USB 或其他电子设备上。 但是&#xff0c;如果您遇到存储设备故障、存储设备逻辑故障或意外删除&#xff0c;您可能会丢失文件…

Android控件WebView实现完整截图

最近总能看到好多APP都支持文章和网页的长截图&#xff0c;出于好奇研究了一下&#xff0c;分享给大家。 网上有好多的例子&#xff0c;其中好多都是已经过时的就不在复述了&#xff0c;我发现有一种还是比较通用的方法。 //android 5.0 之后需要开启浏览器的整体缓存才能截取…

后端程序员入门react笔记(四)-综合运用,写一个小demo

样式模块化 有时候我们会遇到这样的问题&#xff0c;有两个css对一个class声明了样式&#xff0c;这样的话后引入的css会覆盖前面的css样式&#xff0c;导致样式冲突&#xff0c;那么我们怎么解决这种问题呢&#xff0c;我们可以使用样式的模块化&#xff0c;我们起名一个inde…

关于HashMap的面试问题(26问面试题)

文章目录 关于HashMap的面试问题1、HashMap的底层实现2、HashMap的数组的元素类型3、为什么要使用数组&#xff1f;4、HashMap的数组的初始化长度5、HashMap的映射关系的存储索引index如何计算6、HashMap 为什么使用 &按位与运算代替%模运算&#xff1f;7、为什么要使用has…

微服务篇之限流

一、为什么要限流 1. 并发的确大&#xff08;突发流量&#xff09;。 2. 防止用户恶意刷接口。 二、限流的实现方式 1. Tomcat限流 可以设置最大连接数&#xff0c;但是每一个微服务都有一个tomcat&#xff0c;实现起来非常麻烦。 2. Nginx限流 &#xff08;1&#xff09;控…

解决IDEA git 提交慢的问题

文章目录 前言解决IDEA git 提交慢的问题 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! 解…

路由器的端口映射如何设置?

路由器的端口映射设置是网络连接中常用的配置功能&#xff0c;通过将外部网络访问请求映射到内部设备&#xff0c;实现局域网内设备的远程访问。本文将介绍如何进行路由器的端口映射设置&#xff0c;并以【天联】组网产品为例进行说明。 【天联】组网产品介绍 【天联】组网是一…

jenkins报错:Pseudo-terminal will not be allocated because stdin is not a terminal

jenkins的流水线部分代码如下 sh ssh root192.168.2.234 << remotessh cd /var/lib/jenkins/workspace/txkc /usr/local/maven/apache-maven-3.8.6/bin/mvn clean package -U ls remotessh执行流水线出现报错&#xff1a;Pseudo-terminal will not be allocated because…

汽车制造5G智能工厂数字孪生可视化平台,推进汽车行业数字化转型

汽车制造5G智能工厂数字孪生可视化平台&#xff0c;推进汽车行业数字化转型。在当今数字化时代&#xff0c;汽车行业正面临着前所未有的挑战和机遇。随着5G技术的快速发展&#xff0c;汽车制造正在向智能化、数字化转型&#xff0c;而数字孪生技术作为这一转型的核心驱动力&…

数据仓库【指标体系】

指标体系是将零散单点的具有相互联系的指标&#xff0c;系统化的组织起来&#xff0c;通过单点看全局&#xff0c;通过全局解决单点的问题。它主要是由指标和体系两部分组成。 指标是指将业务单元细化后量化的度量值&#xff0c;它使得业务目标可描述、可度量、可拆解&#xff…

谷粒商城篇章9 ---- P248-P261/P292-P294 ---- 消息队列【分布式高级篇六】

目录 1 消息队列(Message Queue)简介 1.1 概述 1.2 消息服务中两个重要概念 1.3 消息队列主要有两种形式的目的地 1.4 JMS和AMQP对比 1.5 应用场景 1.6 Spring支持 1.7 SpringBoot自动配置 1.7 市面上的MQ产品 2 RabbitMQ 2.1 RabbitMQ简介 2.1.1 RabbitMQ简介 2…

在UE5中制作UI环形进度条

在日常开发中&#xff0c;经常会有环形进度条UI的效果&#xff0c;例如技能CD时间、加载动画等&#xff0c;本文将通过材质球节点实现该效果&#xff0c;相较于准备美术素材&#xff0c;这样的做法更为方便&#xff0c;效果如下&#xff1a; 1.制作环状效果材质函数 在内容面…

SAP PP学习笔记03 - SAP中如何设定项目选择

上次这篇文章里面讲了界面的字段显示顺序及是否显示的设置。 并做了 事务代码 控制界面显示的例子。 SAP PP学习笔记02 - PP中配置品目Master时的顺序-CSDN博客 那么&#xff0c;每次控制界面显示什么都要这么挨个 这么设置一遍吗&#xff1f; 那岂不得烦死。 其实SAP里面参…

gitlab,从A仓库迁移某个工程到B仓库,保留提交记录

从A仓库&#xff0c;拷贝 git clone --bare ssh://git192.168.30.88:22/framework/platform.git 在B仓库新建工程&#xff0c;注意&#xff1a;一定要去掉默认的生成README文件进入platform.git 文件夹下&#xff0c;推送到B仓库 git push --mirror ssh://git192.168.30.100…

Stable Diffusion——文生图界面参数讲解与提示词使用技巧

Clip终止层数 什么是Clip CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09;是由OpenAI于2021年开发的一种语言图像对比预训练模型。其独特之处在于&#xff0c;CLIP模型中的图像和文本嵌入共享相同的潜在特征空间&#xff0c;这使得模型能够直接在图像和文…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第八天-高级驱动framebuffer(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1cd7LOSAvmPgVRPAyuMX7Fg?pwd1688 提取码&#xff1a;1688 帧缓冲&#xff08;framebuffer&#xff09;设备应用于linux显示技术方面。因为linux的显示平台已经全部基于framebuffer&#xff0c;所以目前在linux环境下开发图形化界面、…

电脑死机卡住怎么办 电脑卡住鼠标也点不动的解决方法

在我们使用电脑的过程中,可能由于电脑硬件或者软件的问题,偶尔会出现电脑卡住的情况,很多电脑小白都不知道电脑卡住了怎么办,鼠标也点不动,键盘也没用,一旦发生了这种情况,大家可以来参考一下小编分享的电脑死机卡住的解决方法。 电脑卡住鼠标也点不动的解决方法 方…