本文主要讲述基于vc++6.0 mfc图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过mfc单文档视图实现显示bmp图像增强处理,包括图像普通平滑、高斯平滑、不同算子的图像锐化知识。希望该篇文章对你有所帮助,尤其是初学者和学习图像处理的学生。
免费资源下载地址:
图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强的方法是因应用不同而不同的,研究内容包括:(参考课件和左飞的《数字图像处理》)

图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。
1.简单平滑-邻域平均法
图像简单平滑是指通过邻域简单平均对图像进行平滑处理的方法,用这种方法在一定程度上消除原始图像中的噪声、降低原始图像对比度的作用。它利用卷积运算对图像邻域的像素灰度进行平均,从而达到减小图像中噪声影响、降低图像对比度的目的。
但邻域平均值主要缺点是在降低噪声的同时使图像变得模糊,特别在边缘和细节处,而且邻域越大,在去噪能力增强的同时模糊程度越严重。
2.高斯平滑
为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。
在图像简单平滑中,算法利用卷积模板逐一处理图像中每个像素,这一过程可以形象地比作对原始图像的像素一一进行过滤整理,在图像处理中把邻域像素逐一处理的算法过程称为滤波器。平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均,也称为均值滤波器。
高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的3*3和5*5领域的高斯模板。
模板越靠近邻域中心位置,其权值越高。在图像细节进行模糊时,可以更多的保留图像总体的灰度分布特征。下图是常用的四个模板和matlab代码实现:
代码如下:
运行效果如下图所示:
3.中值滤波
在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。
选一个含有奇数点的窗口w,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。
例如选择滤波的窗口如下图,是一个一维的窗口,待处理像素的灰度取这个模板中灰度的中值,滤波过程如下:
常用的窗口还有方形、十字形、圆形和环形。不同形状的窗口产生不同的滤波效果,方形和圆形窗口适合外轮廓线较长的物体图像,而十字形窗口对有尖顶角状的图像效果好。
4.边界保持类滤波
k近邻均值滤波器(knnf)是指在m*m的窗口中,属于同一集合类的像素,它们的灰度值将高度相关。被处理的像素(对应于窗口中心的像素)可以用窗口内与中心像素灰度最接近的k个近邻像素的平均灰度来替代。步骤如下:
(1).作一个m*m的作用模板
(2).在其中选择k个与待处理像素的灰度差为最小的像素
(3).用这k个像素的灰度均值替换掉原来的值
在k近旁均值滤波器(knnmf)中,不选k个邻近像素的平均灰度来替代,而选k个邻近像素的中值灰度来替代,上图中2,3,3中选择3即可。
下面介绍具体mfc vc++6.0代码实现过程。
第一步:在资源视图的menu中添加子菜单“图像增强”,然后添加“图像平滑”四个选项如下图所示:
第二步:打开类向导,在imageprocessingview类中添加相应的四个实现函数:
第三步:就是具体的平滑实现函数。
1.普通平滑 模板一
该算法采用的模板如下:
运行效果如图所示,图像平滑模糊了,但效果不是很好。
其中实现的具体原理如下:
首先将图像像素矩阵转换为(x,y)的二维矩阵进行操作,同时获取(x,y)坐标为中心的3*3矩阵,再通过它与3*3模板进行像素平均操作,就是两个3*3矩阵互乘。需要注意的是矩阵一个格子是rgb三字节(24位bmp),同时获取该中心点位置时,通过两层循环for(k=n-1;k<=n+1;k++)实现获取矩阵中九个点的像素。最后对该点(x,y)的rgb进行赋值操作即可。
2.普通平滑 模板二
你可能注意到了,在图像处理过程中,如果每行的字节数不是4的倍数,可能会出现斜线之类的处理bug,所以需要手动补0筹齐4的倍数,代码中补0后运行效果如下图所示,我也一直没找到原因,可能是思想和深度还没有达到,以后有机会在解决吧!同时后面的算法都不准备再进行补0处理,主要讲述算法的思想!
3.高斯平滑
采用的模板如下:
代码如下图所示:
4.中值滤波
中值滤波我的理解是:它不但可以去除孤点噪声,而且可以保持图像的边缘特性,不会产生显著的模糊;它的方法是把局部区域的像素按灰度等级进行排序,再取该邻域中灰度的中值作为当前像素的灰度值。其步骤如下:
(1).将滤波模板(含若干个点的滑动窗口)在图像中漫游,并将模板中心与图像中的某个像素位置重合;
(2).读取模板中各对应像素的灰度值;
(3).将这些灰度值从小到大排序;
(4).取这一列数据的中间数据,将其赋值给对应模板中心位置的像素。
我采用的是3*3的模本,取矩阵中间位置像素替代原像素。代码如下:
ps:这部分总算讲述完成,算法都是根据自己的理解用底层代码实现的,而不是向其它的通过调用gdi+库实现。可能存在因为理解不够或其它的错误,欢迎提出修改~
推荐资料:
有时还需要加强图像中景物的边缘和轮廓,边缘和轮廓通常位于图像中灰度突出的地方,因而可以直观的想到用灰度的差分对边缘和轮廓进行提取,通常可以通过梯度算子进行提取。图像锐化的目的是提高图像的对比度,从而使图像更清晰,通过提高邻域内像素的灰度差来提高图像的对比度。
下面介绍图像锐化的几种算子及效果。
1.拉普拉斯算子(laplacian)
拉普拉斯算子是图像邻域内像素灰度差分计算的基础,通过二阶微分推导出的一种图像邻域增强算法。它的基本思想是当邻域的中心像素灰度低于它所在邻域内的其他像素的平均灰度时,此中心像素的灰度应该被进一步降低;当高于时进一步提高中心像素的灰度,从而实现图像锐化处理。
在算法实现过程中,通过对邻域中心像素的四方向或八方向求梯度,并将梯度和相加来判断中心像素灰度与邻域内其他像素灰度的关系,并用梯度运算的结果对像素灰度进行调整。
一个连续的二元函数f(x,y),其拉普拉斯运算定义为:
对于数字图像,拉普拉斯算子可以简化为:
也可以表示为卷积的形式:
其中k=1,i=1时h(r,s)取下式,四方向模板:
通过模板可以发现,当邻域内像素灰度相同时,模板的卷积运算结果为0;当中心像素灰度高于邻域内其他像素的平均灰度时,模板的卷积运算结果为正数;当中心像素的灰度低于邻域内其他像素的平均灰度时,模板的卷积为负数。对卷积运算的结果用适当的衰弱因子处理并加在原中心像素上,就可以实现图像的锐化处理。
其中实现过程步骤如下:
添加子菜单和类向导添加实现函数
2.高通滤波
常用的高通模板如下所示,其中h2有的书又称为拉普拉斯八方向的锐化模板。
选取h2模板,代码如下所示:
运行效果如下图所示,该效果相对较好:
3.sobel算子
代码如下所示,需要注意x和y两个方向的模板处理:
如果采用sobel边缘细化,建议二值化(0和255阈值化)处理后再锐化,彩色图建议先灰度处理再进行其他处理。
4.isotropic算子
代码实现如下:
运行效果如下图所示,效果与上面的sobel类似:
5.prewitt算子
运行效果如下图所示,只选取了x分量:
最后还是希望文章对你有所帮助,如果文章有不足或错误之处,请海涵。自己给自己点个赞,挺不容易的,但还会继续写完~同时后面的图像处理准备研究些感兴趣的东西,而不是这样的长篇大论了,例如怎样实现验证码提取、如何实现图像恢复、dicom图像等知识吧!