【VS开发】【图像处理】直方图均衡与平台直方图
直方图均衡化(Histogram
Equalization)
直方图均衡化的主要过程
- 统计每一个灰度值的像素点数和所占的百分比
- 累加每一个灰度值的百分比
- 利用新的灰度值的百分比,重新计算每一个灰度值的变化
- 将新的的对应的关系映射到新的图像中
一个简单的例子
1、图像的灰度直方图求法为:
(1)先计算图像中各个灰度级的出现频率,用h(i)表示灰度级i的出现频率,其值等于灰度级出现次数/图像像素个数:
h(0)=2/16
h(1)=1/16
h(2)=3/16
h(3)=2/16
h(4)=0/16
h(5)=1/16
h(6)=4/16
h(7)=1/16
h(8)=1/16
h(9)=1/16
h(10)=h(11)=h(12)=h(13)=h(14)=h(15)=0/16。
然后以灰度级i为横轴,出现频率h(i)为纵轴即可绘制出图像对应的直方图。
(2)图像进行直方图均衡化处理的过程为:
先计算累积分布,用r(i)表示灰度级i的累积分布:
r(0)=h(0)=2/16
r(1)=r(0)+h(1)=2/16+1/16=3/16
r(2)=r(1)+h(2)=3/16+3/16=6/16
r(3)=r(2)+h(3)=6/16+2/16=8/16
r(4)=r(3)+h(4)=8/16+0/16=8/16
r(5)=r(4)+h(5)=8/16+1/16=9/16
r(6)=r(5)+h(6)=9/16+4/16=13/16
r(7)=r(6)+h(7)=13/16+1/16=14/16
r(8)=r(7)+h(8)=14/16+1/16=15/16
r(9)=r(8)+h(9)=15/16+1/16=16/16=1
r(10)=r(11)=r(12)=r(13)=r(14)=r(15)=1
将累积分布进行量化(量化时需要用到原始图像的灰度级数,这也是为什么前面需要说明的原因),量化后的灰度级用rq(i)表示,量化公式为rq(i)=ROUND(r(i)*15),(说明:量化公式中的15等于原始图像灰度级数减1),可得:
rq(0)=ROUND(r(0)*15)=2
rq(1)=ROUND(r(1)*15)=3
rq(2)=ROUND(r(2)*15)=6
rq(3)=ROUND(r(3)*15)=8
rq(4)=ROUND(r(4)*15)=8
rq(5)=ROUND(r(5)*15)=8
rq(6)=ROUND(r(6)*15)=12
rq(7)=ROUND(r(7)*15)=13
rq(8)=ROUND(r(8)*15)=14
rq(9)=ROUND(r(9)*15)=15
rq(10)=ROUND(r(10)*15)=15
rq(11)=ROUND(r(11)*15)=15
rq(12)=ROUND(r(12)*15)=15
rq(13)=ROUND(r(13)*15)=15
rq(14)=ROUND(r(14)*15)=15
rq(15)=ROUND(r(15)*15)=15
因此,原始图像中的灰度级和均化后图像中的灰度级之间的对应关系为:
0->2
1->3
2->6
3->8
4->8
5->8
6->12
7->13
8->14
9->15
10->15
11->15
12->15
13->15
14->15
15->15
将原始图像中对应的灰度值安装上述对应关系替换成相应的灰度值,即可得到均化图像,结果如下:
3 8 13 8
6 12 2 12
14 6 12 8
关键的代码实现
- </pre><pre name="code" class="cpp"><span style="white-space:pre"> </span>Mat src,dest;
- <span style="white-space:pre"> </span>Src.copyTo(src);
- if (src.channels() > 1)
- {
- cvtColor(src, src, CV_BGR2GRAY);
- }
- MatND hist;
- const int histSize = 256;
- float range[] = { 0, 255 };
- const float *ranges[] = { range };
- const int channels = 0;
- cv::calcHist(&src, 1, &channels, Mat(), hist, 1, &histSize, ranges);
- float total = src.size().width* src.size().height;
- float bins[histSize] = { 0 };
- float binsAcc[histSize] = { 0 };
- Mat lut(1, 256, CV_8U);
- vector<float> vectorBins;
- vector<float> maxBins;
- float sumBins = 0.0;
- int countMax = 0;
- float TValue = 0;
- // Find the mapping table
- for (int i = 0; i<histSize; i++)
- {
- float bin_val = hist.at<float>(i); // 第i灰度级上的数
- bins[i] = bin_val / total;
- if (bins[i] > 0)
- {
- vectorBins.push_back(bins[i]);
- }
- if (i>0)
- {
- binsAcc[i] =binsAcc[i-1] + bins[i];
- }
- else
- {
- binsAcc[0] = bins[0];
- }
- lut.at<uchar>(i) = static_cast<uchar>(cvRound(binsAcc[i] * 255));
- }
- Mat dest2;
- equalizeHist(src, dest2);
- imshow("equlization2", dest2);
平台直方图及均衡化
平台直方图的概念
这种方法是基于直方图均衡算法的改进算法,它是通过在直方图分布中设计一个阈值T来 对原来直方图进行改造。
这种方法的思路是:如果原直方图中某些灰度级对应的值大于阈值T,就将该处的值设置为T。要是该处的值不大于T时,那么该处的值保持不变。

其中 Pt(k)是平台直方图, Pr(k)是原来的直方图
和直方图均衡类似,对平台直方图进行累加计算,得到累积函数
然后通过均衡化把原图灰度值改为新的灰度值
.png)
.png)
.png)
平台阈值的确定
关键代码实现
- Mat src,dest;
- Src.copyTo(src);
- if (src.channels() > 1)
- {
- cvtColor(src, src, CV_BGR2GRAY);
- }
- MatND hist;
- const int histSize = 256;
- float range[] = { 0, 255 };
- const float *ranges[] = { range };
- const int channels = 0;
- cv::calcHist(&src, 1, &channels, Mat(), hist, 1, &histSize, ranges);
- float total = src.size().width* src.size().height;
- float bins[histSize] = { 0 };
- float binsAcc[histSize] = { 0 };
- Mat lut(1, 256, CV_8U);
- vector<float> vectorBins;
- vector<float> maxBins;
- float sumBins = 0.0;
- int countMax = 0;
- float TValue = 0;
- // Find the mapping table
- for (int i = 0; i<histSize; i++)
- {
- float bin_val = hist.at<float>(i); // 第i灰度级上的数
- bins[i] = bin_val / total;
- if (bins[i] > 0)
- {
- vectorBins.push_back(bins[i]);
- }
- }
- // Calculate the Meadin value by 3 sapce
- for (int i = 1; i < vectorBins.size() - 1; i++)
- {
- if (vectorBins[i] < vectorBins[i - 1] && vectorBins[i - 1] < vectorBins[i + 1] || vectorBins[i] > vectorBins[i - 1] && vectorBins[i - 1] > vectorBins[i + 1])
- {
- vectorBins[i] = vectorBins[i - 1];
- }
- else if (vectorBins[i] < vectorBins[i + 1] && vectorBins[i + 1] < vectorBins[i - 1] || vectorBins[i] > vectorBins[i + 1] && vectorBins[i + 1] > vectorBins[i - 1])
- {
- vectorBins[i] = vectorBins[i + 1];
- }
- }
- // Calculate the max peak value
- for (int i = 1; i < vectorBins.size() - 1; i++)
- {
- if (vectorBins[i] - vectorBins[i - 1] >= 0 && vectorBins[i+1] - vectorBins[i] <= 0)
- {
- maxBins.push_back(vectorBins[i]);
- sumBins += vectorBins[i];
- countMax++;
- }
- }
- TValue = sumBins / countMax;
- // Find the mapping table
- for (int i = 0; i<histSize; i++)
- {
- if (bins[i] > TValue)
- {
- bins[i] = TValue;
- }
- if (i>0)
- {
- binsAcc[i] = binsAcc[i - 1] + bins[i];
- }
- else
- {
- binsAcc[0] = bins[0];
- }
- }
- for (int i = 0; i < histSize; i++)
- {
- lut.at<uchar>(i) = static_cast<uchar>(cvRound(binsAcc[i] * 255 / binsAcc[255]));
- }
- LUT(src, lut, dest);
- imshow("src", src);
- imshow("equlization", dest);
欢迎转载,请注明本文的出处:http://blog.csdn.net/fioletfly/article/details/51011399 谢谢!
【VS开发】【图像处理】直方图均衡与平台直方图的更多相关文章
- 基于C#和Asp.NET MVC开发GPS部标监控平台
基于交通部796标准开发部标监控平台,选择开发语言和技术也是团队要思考的因素,其实这由团队自己擅长的技术来决定,如果擅长C#和Asp.NET, 当然开发效率就高很多.当然了技术选型一定要选用当前主流的 ...
- 【原创】开发Kafka通用数据平台中间件
开发Kafka通用数据平台中间件 (含本次项目全部代码及资源) 目录: 一. Kafka概述 二. Kafka启动命令 三.我们为什么使用Kafka 四. Kafka数据平台中间件设计及代码解析 五. ...
- 目前网络上大部分的网站都是由ASP或PHP开发,并且java平台的软件购买成本不适合中小企业客户,一般适用于银行、国家安全等行业领域
目前网络上大部分的网站都是由ASP或PHP开发,并且java平台的软件购买成本不适合中小企业客户,一般适用于银行.国家安全等行业领域. 要求建设开发大型复杂的网站,但仅有一个idea,不能够提供网站详 ...
- C#开发微信公众化平台
C#开发微信公众化平台 写在前面 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文.菜单事件响应) 示例Demo下载 后记 最近公司在做微信开发,其实就是接口开发,网上 ...
- Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE
Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE Windows平台下安装Arduino IDE Windows操作系统下可以使用安装向导和压缩包形式安装.下面详细讲解这 ...
- Win8 Metro(C#)数字图像处理--3.3图像直方图计算
原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary> /// Get the array of histrgram. /// </sum ...
- .NET Core开发的iNeuOS物联网平台部署树霉派,从网关到云端整体解决方案。助力2019中国.NET峰会。
2019 中国.NET 开发者峰会正式启动 目 录 1. 概述... 2 2. 树莓派硬件配置... 2 3. 软件信息... 3 4. Raspb ...
- [视频演示].NET Core开发的iNeuOS物联网平台,实现从设备&PLC、云平台、移动APP数据链路闭环
目 录 1. 概述... 1 2. 登陆信息... 2 3. 设备驱动... 3 4. 组态建模... 3 5. 手机APP. 5 6. ...
- .NET Core开发的iNeuOS物联网平台部署树霉派(raspbian),从网关到云端整体解决方案。助力2019中国.NET峰会。
2019 中国.NET 开发者峰会正式启动 目 录 1. 概述... 2 2. 树莓派硬件配置... 2 3. 软件信息... 3 4. Raspb ...
随机推荐
- HTML5上传超大文件解决方案
一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...
- 交换机配置——STP实验(指定特定交换机为根桥)
一.实验目的:将三层交换机Switch3设置为根桥交换机 二.拓扑图如下: 三.具体步骤 先说明一下,四个交换机形成环路,为解决环路问题交换机会自动进行选举,选举出一个根源,根桥交换机会决定一个最佳路 ...
- FZU - 2218 Simple String Problem 状压dp
FZU - 2218Simple String Problem 题目大意:给一个长度为n含有k个不同字母的串,从中挑选出两个连续的子串,要求两个子串中含有不同的字符,问这样的两个子串长度乘积最大是多少 ...
- bzoj3307 雨天的尾巴题解及改题过程(线段树合并+lca+树上差分)
题目描述 N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式 第一行数字N,M接下 ...
- MySQL_(Java)使用JDBC向数据库发起查询请求
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...
- Vue_(组件)实例属性
Vue实例属性与方法中文文档 传送门 Vue实例属性:vue实例直接调用的属性 Learn 一.vm.$data:获取属性 二.vm.$el:获取实例挂载的元素 三.vm.$options:获取自 ...
- Centos系统下载
在学习或者工作当中,难免会用到不同版本的CentOS镜像,下面就简单的介绍一下如何正确并快速的下载所需要的CentOS镜像. 一.官网下载 官网地址:https://www.centos.org/此种 ...
- IP输出 之 ip_output、ip_finish_output、ip_finish_output2
概述 ip_output-设置输出设备和协议,然后经过POST_ROUTING钩子点,最后调用ip_finish_output: ip_finish_output-对skb进行分片判断,需要分片,则分 ...
- 精讲JS逻辑运算符&&、||,位运算符|,&
1.JS中的||符号: 运算方法: 只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值. 只要“||”前面为true,不管“||”后面是true还是fals ...
- .net 查壳工具
请问大神.NET查壳工具都有哪些? 已知的有DotNet Id 除了这个还有别的吗?脱MAXTOCODE发现是双壳.脱掉第一层还有一层,DotNet Id检测没壳了,但是反编译还是加密状态. 用 ...
