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 ...
随机推荐
- Vue学习笔记-目录结构
1.采用脚手架构建的项目基本目录结构 可能会有些许差别,但是大致基本目录都差不多 2.项目入口(index.html,main.js,App.vue) 一般情况下,我们都习惯性将 index.html ...
- struts2中的数据类型自动转换
参考:https://blog.csdn.net/qq_35326718/article/details/72453042 https://www.cnblogs.com/aigeileshei/p/ ...
- hadoop fs、hadoop dfs与hdfs dfs命令的区别
Hadoop fs:使用面最广,可以操作任何文件系统. hadoop dfs与hdfs dfs:只能操作HDFS文件系统相关(包括与Local FS间的操作),前者已经Deprecated,一般使用后 ...
- TCP/IP||Traceroute
1.概述 由Van jacobson编写的工具,用于探索tcp/ip协议,使用ICMP报文和首部TTL字段,TTL字段由发送端设置一个8bit字段,初始值为RFC指定,当前值为64, 每个处理数据的路 ...
- Linux Centos7 环境基于Docker部署Zookeeper服务搭建实战
配置Zookeeper安装目录 在宿主机配置zookeeper安装目录:/docker/develop/zookeeper 并且在文件夹创建 data 和logs 目录: mkdir -p /dock ...
- 嗨,让我带你逐行剖析Vue.js源码
本项目受到了阮一峰老师的肯定,已刊登在阮一峰老师微信公众号的科技爱好者周刊第87期,同时也被多个微博大V转发,短短一个月时间内在github上star数量就已经突破2k! Hello,大家好,我最近在 ...
- TensorFlow之tf.less()
函数:tf.less less( x, y, name=None ) 以元素方式返回(x <y)的真值. 注意:Less支持广播. 参数: x:张量.必须是下列类型之一:float32,floa ...
- leetcode.310最小高度树
对于一个具有树特征的无向图,我们可选择任何一个节点作为根.图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树.给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点. ...
- 推荐中的多任务学习-YouTube视频推荐
本文将介绍Google发表在RecSys'19 的论文<Recommending What Video to Watch Next: A Multitask Ranking System> ...
- Redis系列之----Redis的数据类型及使用场景
Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,能够提供多种不同的键值数据类型来适应不同场景下的缓存和存储需求. Redis中所有的数据都存储在内存中,因此读写速度非常快,相 ...