c#数字图像处理(六)直方图均衡化
直方图均衡化又称直方图修平,是一种很重要的非线性点运算。使用该方法可以加强图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好的在直方图上分布。
直方图均衡化的基本思想是把原始图像的直方图变换为均匀分布的形式。这样增加了灰度值的动态范围,从而达到增强图像整体对比度的效果。
算法步骤:
1)计算图像f(x,y)的各灰度级中像素出现的概率p(i)。
2) 计算p的累计概率函数c(i),c即为图像的累计归一化直方图
3)将c(i)缩放至0~255范围内
/// <summary>
/// 直方图均衡化 直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同
/// 增大对比度,从而达到图像增强的目的。是图像处理领域中利用图像直方图对对比度进行调整的方法
/// </summary>
/// <param name="srcBmp">原始图像</param>
/// <param name="dstBmp">处理后图像</param>
/// <returns>处理成功 true 失败 false</returns>
public static bool Balance(Bitmap srcBmp, out Bitmap dstBmp) {
if (srcBmp == null) {
dstBmp = null;
return false;
}
int[] histogramArrayR = new int[];//各个灰度级的像素数R
int[] histogramArrayG = new int[];//各个灰度级的像素数G
int[] histogramArrayB = new int[];//各个灰度级的像素数B
int[] tempArrayR = new int[];
int[] tempArrayG = new int[];
int[] tempArrayB = new int[];
byte[] pixelMapR = new byte[];
byte[] pixelMapG = new byte[];
byte[] pixelMapB = new byte[];
dstBmp = new Bitmap(srcBmp);
Rectangle rt = new Rectangle(, , srcBmp.Width, srcBmp.Height);
BitmapData bmpData = dstBmp.LockBits(rt, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe {
//统计各个灰度级的像素个数
for (int i = ; i < bmpData.Height; i++) {
byte* ptr = (byte*)bmpData.Scan0 + i * bmpData.Stride;
for (int j = ; j < bmpData.Width; j++) {
histogramArrayB[*(ptr + j * )]++;
histogramArrayG[*(ptr + j * + )]++;
histogramArrayR[*(ptr + j * + )]++;
}
}
//计算各个灰度级的累计分布函数
for (int i = ; i < ; i++) {
if (i != ) {
tempArrayB[i] = tempArrayB[i - ] + histogramArrayB[i];
tempArrayG[i] = tempArrayG[i - ] + histogramArrayG[i];
tempArrayR[i] = tempArrayR[i - ] + histogramArrayR[i];
}
else {
tempArrayB[] = histogramArrayB[];
tempArrayG[] = histogramArrayG[];
tempArrayR[] = histogramArrayR[];
}
//计算累计概率函数,并将值放缩至0~255范围内
pixelMapB[i] = (byte)(255.0 * tempArrayB[i] / (bmpData.Width * bmpData.Height) + 0.5);//加0.5为了四舍五入取整
pixelMapG[i] = (byte)(255.0 * tempArrayG[i] / (bmpData.Width * bmpData.Height) + 0.5);
pixelMapR[i] = (byte)(255.0 * tempArrayR[i] / (bmpData.Width * bmpData.Height) + 0.5);
}
//映射转换
for (int i = ; i < bmpData.Height; i++) {
byte* ptr = (byte*)bmpData.Scan0 + i * bmpData.Stride;
for (int j = ; j < bmpData.Width; j++) {
*(ptr + j * ) = pixelMapB[*(ptr + j * )];
*(ptr + j * + ) = pixelMapG[*(ptr + j * + )];
*(ptr + j * + ) = pixelMapR[*(ptr + j * + )];
}
}
}
dstBmp.UnlockBits(bmpData);
return true;
}
c#数字图像处理(六)直方图均衡化的更多相关文章
- OpenCV-跟我一起学数字图像处理之直方图均衡化
从这篇博文开始,小生正式从一个毫不相干专业转投数字图像处理.废话不多说了,talk is cheap. show me the code. 直方图均衡化目的 由于一些图像灰度的分布过于集中,这样会导致 ...
- 图像处理之直方图均衡化及C源码实现
1 直方图均衡化(Histogram Equalization)简介 图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法.直方图拉伸和直方图均衡化是两种最常见的间接 ...
- 彩色图像的直方图均衡化matlab代码
彩色图像的直方图均衡化 - YangYudong2014的专栏 - CSDN博客 http://blog.csdn.net/yangyudong2014/article/details/4051503 ...
- Win8Metro(C#)数字图像处理--2.30直方图均衡化
原文:Win8Metro(C#)数字图像处理--2.30直方图均衡化 [函数名称] 直方图均衡化函数HistogramEqualProcess(WriteableBitmap src) [算法说明] ...
- python数字图像处理(9):直方图与均衡化
在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放具体解释
本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行解说,主要通过MFC单文档视图实现显示BMP图片空间几何变换.包含图像平移.图形 ...
- 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理具体解释
本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行解说.主要通过MFC单文档视图实现显示BMP图片点运算处理.包含图像灰度线性变换 ...
- 《HALCON数字图像处理》第六章笔记
目录 第六章 图像增强 图像增强的概念和分类 灰度变换 直方图处理 图像的平滑 图像的锐化 图像的彩色增强 我在Gitee上建了个仓库,会将学习书本的时候打的一些代码上传上去,笔记中所有代码都在仓库里 ...
- Win8 Metro(C#)数字图像处理--3.3图像直方图计算
原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary> /// Get the array of histrgram. /// </sum ...
随机推荐
- 推荐:mysql锁 innodb下的记录锁,间隙锁,next-key锁
你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁. 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁. 生活中的间隙 ...
- sparksql 练习题两道
第一题:select '{"id":1,"name":{"url":"http://xxx/yyy/zz/test.js" ...
- Team Foundation Server 2015使用教程【9】:tfs用户账号切换
- 前端——JS
目录 JavaScript概述 ECMAScript和JavaScript的关系 ECMAScript的历史 JavaScript引入方式 Script标签内写代码 引入额外的JS文件 JavaScr ...
- centos7靶机获取不到ip
尝试了好多方法都获取不到靶机ip: 1.首先检查网络链接是否正常 2.重启网卡 /etc/init.d/network restart 3.修改网卡ONBOOT=yes vi /etc/syscon ...
- gulp的简介以及使用方法
环境介绍: pro环境:生产环境,面向外部用户的环境,连接上互联网即可访问的正式环境. pre环境:灰度环境,外部用户可以访问,但是服务器配置相对低,其它和生产一样. test环境:测试环境,外部用户 ...
- 个性化重排--Personalized Re-ranking for Recommendation
推荐中的个性化重排--Personalized Re-ranking for Recommendation 这篇文章是阿里在ResSys'19发表的,主要贡献是在重排序阶段,引入了用户的相关信息,很符 ...
- 如何在Go项目中输出版本信息?
我们经常在使用CLI工具的时候,都会有这样的参数输出: ``` ➜ ~ docker version Client: Docker Engine - Community Version: 18.09. ...
- kubespy 用bash实现的k8s动态调试工具
原文位于 https://github.com/huazhihao/kubespy/blob/master/implement-a-k8s-debug-plugin-in-bash.md 背景 Kub ...
- JPA或Hibernate中使用原生SQL实现分页查询、排序
发生背景:前端展示的数据需要来自A表和D表拼接,A表和D表根据A表的主键进行关联,D表的非主键字段关联C表的主键,根据条件筛选出符合的数据,并且根据A表的主键关联B表的主键(多主键)的条件,过滤A表中 ...