[转载+原创]Emgu CV on C# (三) —— Emgu CV on 均衡化
本文简要描述了均衡化原理及数学实现等理论问题,最终利用emgucv实现图像的灰度均衡。
直方图的均衡化,这是图像增强的常用方法。
一、均衡化原理及数学实现(转载)
均衡化原理及数学实现可重点参看——《直方图均衡化》和《图像处理(3)_灰度分布均衡化》
灰度分布均衡化又称直方图均衡化。
1、概述
这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。
2、原理及数学实现
我们来看一个灰度图像,让ni表示灰度i出现的次数,这样图像中灰度为i 的像素的出现概率是
L 是图像中所有的灰度数,n 是图像中所有的像素数, p 实际上是图像的直方图,归一化到 0....1。
把 c 作为对应于 p 的累计概率函数, 定义为:
c 是图像的累计归一化直方图。
我们创建一个形式为 y=T(xi) 的变化,对于原始图像中的每个值它就产生一个 y,这样 y 的累计概率函数就可以在所有值范围内进行线性化,转换公式定义为:
注意 T 将不同的等级映射到 0...1 域,为了将这些值映射回它们最初的域,需要在结果上应用下面的简单变换:
上面描述了灰度图像上使用直方图均衡化的方法,但是通过将这种方法分别用于图像RGB颜色值的红色、绿色和蓝色分量,从而也可以对彩色图像进行处理。
上述是维基百科对直方图均衡化的原理解释,转化为算法描述则是:
(1)获取目标图像的直方图。
(2)从获取直方图图中获取灰度密度分布。【就是每个灰度级像素个数 / 灰度直方图中像素的总个数】
(3)对密度直方图进行累加,每个灰度级密度是前面所有灰度级的密度总和。
(4)对原图像进行遍历,每个像素值为累加后的概率密度索引值 并 乘上255 对图像进行还原。
二、程序实现
opencv的编程方法可参看《【OpenCV入门指南】第九篇 灰度直方图均衡化》。
emgucv的编程方法相当简单,利用的函数就是cvEqualizeHist。
程序主体框架可利用 [转载+原创]Emgu CV on C# (二) —— Emgu CV on 灰度化 文章中的程序文件。
给窗体添加第三个PictureBox,并将SizeModel设置为Zoom
在灰度化功能函数后直接添加下段程序函数,so easy。
//均衡化 IntPtr Histimg = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(grayimg), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1); CvInvoke.cvEqualizeHist(grayimg, Histimg); MIplImage histmi = (MIplImage)Marshal.PtrToStructure(Histimg, typeof(MIplImage)); Image<Gray, Byte> histimage = new Image<Gray, Byte>(histmi.width, histmi.height, histmi.widthStep, histmi.imageData); pictureBox3.Image = histimage.ToBitmap();
三、结果分析
将《【OpenCV入门指南】第九篇 灰度直方图均衡化》处理的图片剪切下来,由于只有灰度图片,也对该图片进行了灰度处理,并将灰度处理之后的图片进行均衡化。
1、原程序图片
2、剪切获取灰度图片
3、通过emgucv方法进行均衡化,获取的最终图片与原文章得到的图片进行比对。
原文章图片
本文均衡化后的
转载请标明出处,原文地址:http://www.cnblogs.com/MobileBo/p/3917956.html
都是调用的同一个dll,所以差别不是很大,只是emgucv方法中又进行了一次灰度化,会有部分细节损失。
从整理效果看,已经达到了预期要求,灰度直方图均衡化对灰度图的图像增强效果明显,对比度大大增强。