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 ...
随机推荐
- 2018-8-10-win10-uwp-按下等待按钮
title author date CreateTime categories win10 uwp 按下等待按钮 lindexi 2018-08-10 19:16:50 +0800 2018-2-13 ...
- dotnet 特性 DynamicallyInvokable 是用来做什么的
我在 Linq 很多函数都看到 __DynamicallyInvokable 这个特性,这是一个没有官方文档的特性,也许是用来优化反射 在堆栈 网找到了以下描述 这个 __DynamicallyInv ...
- layui图片上传之后后台如何修改图片的后缀名以及返回数据给前台
const pathLib = require('path');//引入node.js下的一个path模块的方法,主要处理文件的名字等工作,具体可看文档 const fs = require(''fs ...
- VisualStudio 断点调试详解
本文详细告诉大家 VisualStudio 断点调试的功能和使用方法,本文使用的是最新 VisualStudio2019 的功能,也许在你看到这篇博客的时候这个版本已经过时 本文将会按照从简单到复杂, ...
- 阿里云基于OSS的云上统一数据保护方案2.0正式发布
近年来,随着越来越多的企业从传统经济向数字经济转型,云已经渐渐成为数据经济IT新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源.阿里云基于O ...
- Java 学习笔记(15)——反射
Java中的类文件最终会被编译为.class 文件,也就是Java字节码.这个字节码中会存储Java 类的相关信息.在JVM执行这些代码时首先根据 java 命令中指定的类名找到.class 文件然后 ...
- 2017.5.11 昨天晚上看fview直播坚果pro回放
对话1 彭林: 我以前也是产品经理,身为产品经理,你有没有感觉我们做出过什么之前不被人接受的东西,但是我们却坚持做了,并且得到的反响非常好. 朱萧木: 没有吧,我们没有做颠覆用户认知或者三观的特别 ...
- 互联网 Java 工程师进阶知识完全扫盲
互联网 Java 工程师进阶知识完全扫盲:https://github.com/doocs/advanced-java
- git命令的基本使用流程
git命令的基本使用流程 前提:已经基本熟悉git的常用命令 1.提交项目 首先,在对项目进行完善后,如果想要将项目更新到github或是阿里code上去,先要使用 git add -A 这一命令的作 ...
- 为什么样本方差的分母是n-1?为什么它又叫做无偏估计?
为什么样本方差的分母是n-1?最简单的原因,是因为因为均值已经用了n个数的平均来做估计在求方差时,只有(n-1)个数和均值信息是不相关的.而你的第n个数已经可以由前(n-1)个数和均值 来唯一确定,实 ...