第三章 空间域图像增强
- 格式:pdf
- 大小:1.17 MB
- 文档页数:8
第三章 图像增强燕山大学电气工程学院 赵彦涛3.1图像增强的概念对于一般可理解的图像增强,是指使经过增强处理后的图像其视觉效果更好,如对于某些图像看起来比较灰暗,增强处理后使其亮度增强,人眼看起来更舒服;也就是说,改善曝光不足或曝光过度对图像的影响。
淡化背景,强化前景;广义的图像增强指处理后的图像比原始图像更适合于特定应用,更有利于后续图像处理,消除噪声干扰,强化有用信息等都可认为为后续的计算机处理、分析更有利。
根据其处理数据所进行空间不同,图像增强的方法可分为空域(空间域)图像增强方法和变换域(频域)增强方法。
空域图像增强方法是直接处理构成图像的像素点的灰度值,而变换域图像增强方法是经过图像变换后,增强方法在其变换域中间接进行。
图像增强是与具体问题紧密相联系的,增强的目的不同,图像类型不同,采用的方法也不同,没有一种增强算法能适用于所有的应用场合。
3.2图像增强的点运算所谓点运算就是输出图像上的每个像素的灰度值仅由相应输入像素点的值确定。
空域方法是指直接对图像的像素点的灰度值进行操作,空域处理可定义为)),((),(y x f T y x g = (1)式中,),(y x f 是输入图像,),(y x g 是处理后的图像,T 是一种操作方法。
3.2.1 直接灰度变换直接进行灰度变换是图像增强最简单的一类方法,设处理前后的图像的像素点的灰度值分别为r 和s ,变换方式为)(r T s = (2)式中,T 是把灰度值r 变换为s 的映射。
由于处理的是数字量,变换函数的值通常存储在一个一维向量中,通过函数或者查表将灰度值r 映射为s 。
对于8比特的灰度值,一个包含这种映射的查找表要有256个记录。
3.2.1.1 图像的直方图图像的直方图表示图像中各种灰度级的个数(或概率),反映了一幅图像中灰度级与出现这种灰度级的概率之间的关系。
对于一个8 bit (有256个灰度等级)的图像,直方图就是Nn r p k k =)( (4) 式中,k r 是第k 个灰度等级, k n 为图像中灰度等级为k r 的像素点的个数,N 是该图像中所有像素点的个数,这里]255,0[ k ,)(k r p 代表原始图像第k 个灰度级出现的概率。
例如,如果有一个图像为图**:v 0=5/64v 1=12/64v 2=18/64v 3=8/64v 4=1/64v 5=5/64v 6=8/64v 7=5/64 该图像像元总数为8*8=64, 灰度值的范围为[0,7],则其直方图计算结果为图*,直方图为图*。
图像直方图是图像明暗信息的统计结果,给出了图像中灰度级分布的全局描述。
如果图像的灰度级是狭窄的,说明图像中像素点的灰度级集中在一小段,那么就意味着图像的对比度较差(图b 中可看出其灰度等级多集中在比较灰度值比较小的区域内,这样的图像看起来比较暗),而广泛分布的直方图意味着图像中像素点的灰度值几乎分布在灰度级的整个区间里面,因此对比度很好(图a ),通过直方图修改可实现图像增强。
3.2.1.2 EmguCV 直方图显示在EmguCV 中,直方图显示的控件为HistogramBox ,要显示直方图,还用到类DenseHistogram 。
首先从工具栏中将控件HistogramBox 添加到主程序面板中,然后在HelloWorld 例程中直接修改ImageGrabbed()函数:050100150200250050010001500200025003000050100150200250020040060080010001200void _capture_ImageGrabbed(object sender, EventArgs e){Image<Gray, Byte> image = _capture.RetrieveGrayFrame();int rBins = 256;RangeF rRange = new RangeF(0f, 255f);histogramBox1.ClearHistogram();DenseHistogram hist = new DenseHistogram(rBins, rRange);hist.Calculate(new IImage[] { image }, false, null);histogramBox1.AddHistogram("直方图", Color.Red, hist);imageBox1.Image = image;histogramBox1.Refresh();}首先要创建一个DenseHistogram对象hist,然后通过其成员函数Calculate()计算图像的直方图,然后把hist添加到histogramBox1的直方图显示。
如果得到是视频,可以通过成员函数ClearHistogram()清除直方图、通过Refresh()刷新显示,结果如图*所示。
由于_capture_ImageGrabbed()函数分属不同线程,为解决此问题,可在构造函数Form1()中添加代码:CheckForIllegalCrossThreadCalls = false;3.2.1.3 直方图均衡化直方图均衡化通过调整图像灰度级,使图像的直方图均匀的分布在灰度级的整个区域,实现增加像素灰度值的动态范围,从而达到增强图像整体对比度的效果,直方图均衡化的目的如图*所示,a 输入图像直方图b均衡化后图像直方图图直方图均衡化的目的EmguCV中,类Image有一个成员函数可直接实现其均衡化void _EqualizeHist()需要注意的是该函数的返回值为空,该函数直接原始图像变量。
Image<Bgr, byte> frame = new Image<Bgr, byte>(‘”Lena.jpg”);frame._EqualizeHist();将彩色图像frame进行直方图均衡化后的结果直接反映在图像frame上。
图*为均衡化结果,左侧图为原始图像,右侧为均衡化后的图像。
3.2 图像空域滤波增强空域滤波是直接针对图像中的像素点的灰度值借助模板进行邻域操作,按照其特点,空间滤波的方法可分为线性滤波和非线性滤波两大类。
线性滤波的概念源于频域中信号处理所使用的傅立叶变换,非线性空间滤波则一般只能在空域中进行,即直接对邻域进行操作。
图像空域滤波方法根据功能划分,主要分为图像平滑和图像锐化。
图像平滑可以减弱或消除傅立叶空间的高频分量,但不影响低频分量。
由于图像经傅立叶变换后的高频部分对应原始图像的边缘部分,而低频部分对应图像的平滑部分,高频分量滤除后相当于去除了图像的边缘,使图像模糊,图像的平滑的作用主要是模糊和噪声消除。
3.2.1 邻域平均法设有一幅N×N的图像f(x,y),若平滑图像为g(x,y),则有式中 x,y =0,1,…,N-1;s 为(x,y )邻域内像素坐标的集合;M 表示集合s 内像素的总数。
可见邻域平均法就是将当前像素邻域内各像素的灰度平均值作为其输出值的去噪方法。
• 邻域平滑特点:• (1)算法简单。
• (2)降低噪声的同时使图像产生模糊,特别在边缘和细节处。
而且邻域越大,在去噪能力增强的同时模糊程度越严重。
模板操作是数字图像处理中常用的一种运算方式,图像的平滑、锐化等都要用到模板操作。
其实现的方法为图*所示,不失一般性,假设要计算像素点P5用所给3×3模板的滤波过程为:P 5new = Pi ∗Hi 9i =1H1H4H7H2H5H8H3H6H93×3邻域3×3模板P1.H1+P2.H2+P3.H3+P4.H4+P5.H5+P6.H6+P7.H7+P8.H8+P9.H9=P5的新值从图像的左上角,依次向右向下移动,一直运算到图像的右下角,计算出原始图像中所有的像素点的值(边缘点不处理,或需要特殊处理)。
空域低通滤波(图像平滑)的模板有:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=111111111911H ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=1111211111012H ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=1212421211613H空域高通滤波(图像锐化)常用的模板有:EmguCV 中,图像平滑的函数有很多,都属于类Image 的成员函数,主要有三个: SmoothBilatral(int kernelSize,int colorSigma, int spaceSigma)moothBlur(int width, int height) (有重载函数)SmoothGaussian(int kernelSize) (有重载函数)例如代码:Image<Gray, Byte> frame = _capture.RetrieveGrayFrame();Image<Gray, Byte> SmoothFrame = frame.SmoothGaussian(3);可以实现3*3大小的高斯平滑滤波。
由于各种图像传感器都存在噪声,消除这种噪声的最好的方法是计算多幅相同背景图像的均值,但有时多幅相同背景图像不易得到,常用相邻像素点实现图像的平滑运算,平滑滤波的主要作用是消除图像噪声,但在消除噪声的同时,也使图像变得模糊。
通常在进行边缘检测时,首先应对图像进行平滑滤波,以消除噪声对于边缘检测结果的影响。
3.3 中值滤波中值滤波是一种典型的非线性滤波方法。
中值滤波就是用一个奇数点的移动窗口, 先将小窗口内的所有像素的灰度按从大到小的顺序排列,将中间值作为该像素点的灰度值。
其代码为:Image<Gray, Byte> SmoothFrame =frame.SmoothMedian(5);可实现窗口大小为5*5的中值滤波,中值滤波在消除噪声的同时,可较好地保持图像边缘,对于椒盐噪声消除的效果非常好。
3.4 卷积在Emgucv 中,图像的卷积已经将其变为操作符 *,其原型为:public static Image <TColor, float > operator *(Image <TColor, TDepth> image,ConvolutionKernelF kernel)其中kernel 为卷积的变换核,例如可以定义:float[,] kernel = { { 0, 2, 0 }, { 2, 4, 2 }, { 0, 2, 0 } };ConvolutionKernelF mykernel = new ConvolutionKernelF(kernel);FrameOut=frame * mykernel例如:float [,] kernel = { { 0, -1, 0 }, { -1,5, -1 }, { 0, -1, 0 } };ConvolutionKernelF mykernel = new ConvolutionKernelF (kernel);imageBox1.Image = frame* mykernel;imageBox2.Image = frame.Convert<Gray , byte >();textBox1.Text = (frame * mykernel).AbsDiff(new Bgr (0,0,0))[100, 100].ToString();textBox2.Text = (frame.Convert<Gray , byte >())[100, 100].ToString();3.3 图像锐化及边缘检测3.3.1 常用边缘检测算子图像锐化可用高通滤波实现,即保留高频部分,滤除其低频部分。