1、图像平滑与锐化昆明理工大学(数字图像处理)实验报告实验名称: 图像平滑与锐化 一、实验目的(1) 理解图像平滑与锐化的基本原理。(2) 学会使用C语言编程实现图像的平滑与锐化。二、实验原理领域平均法(均值滤波)领域平均法是一种局部空间域处理的算法,它是线性滤波。设一幅图像为的阵列,平滑后的图像为,它的每个像素的灰度级由包含在的预定领域内的几个像素的灰度级的平均值所决定。即在图像上对待处理的像素给一个模板,该模板包括了其周围的邻近像素,将模板中的全体像素的均值来替代原来的像素值。(其中,x,y=0,1, ,N-1;S为点的领域中心点的坐标集合(不包括点);M是S内坐标点的总数)。所用的领域半径越
2、大,则平均后图像的模糊程度也越大。如果图像中的噪声是随机不相关的加性噪声,窗口内各点的噪声是独立等分布的,那么经过上述平滑后,性噪比可以提高倍,但它的主要缺点是在降低图像噪声的同时使图像产生模糊,特别是在边缘和细节处,领域越大,模糊越厉害。中值滤波法如果既要消除噪声又要保持图像的细节可以使用中值滤波器,它是一种非线性平滑滤波器。中值滤波在一定条件下可以克服线性滤波器带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声最为有效。但对于一些细节多,特别是点、线、尖顶多的图像不宜采用中值滤波。中值滤波的算法步骤为:将模板在图像范围内漫游,并将模板中心与图中某个像素位置重合读取模板中各对应像素的灰度值
3、将得到的灰度值从小到大排成一列找到这些值中排在中间的那个值将这个中间值赋给对应模板中心位置的像素。中值滤波器的主要功能是使与周围像素灰度级相差比较大的像素取与周围像素灰度值接近的值,从而消除孤立噪声点。由于这种方法并不是简单地取平均值,所以产生的模糊度较小。图像锐化图像锐化的目的是使模糊的图像变得更加清晰。图像模糊的实质是图像受到平均或积分运算,因此为实现图像的锐化,必须用它的逆运算,如微分法,来使图像清晰化。从频谱角度来看,图像模糊的实质是其高频分量受到了衰减。能够进行锐化的图像必须要有较高的信噪比,否则,锐化后的图像信噪比反而更低,从而使噪声的增加比信号还要多,因此,一般是先滤除或抑制噪声
4、后再进行锐化处理。图像锐化(1)梯度法: (矢量指向函数最大变化率的方向;矢量的幅度表示在的方向上每单位距离的最大增加率,的幅度定义为)。对于数字图像,微分运算一般用差分来代替。常用的差分形式有两种,分别表示幅度为:。利用差分运算时,图像的最后一行和最后一列的像素的梯度无法求得,一般用前一行和前一列的梯度值近似代替。由梯度的计算可知,在图像中灰度变化较大的的边缘区域其梯度值大,在图像灰度变化平缓的区域其梯度值较小,而在灰度均匀区域其梯度值为零。(2)Sobel算子 由于引入平均,对图像中随机噪声有一定的平滑作用,边缘两侧元素得到加强,故边缘显得粗而亮。三、实验内容及步骤1、 打开菜单编辑器,在
5、主菜单中添加一菜单项,选中弹出式选项,修改菜单名称为“图像平滑”。然后建立一下级菜单,打开属性给菜单一个ID号,修改标明为“均值滤波”,打开类向导,建立消息响应函数,实现图像均值滤波。添加的函数代码:void CGsmView:OnJunzhilvbo() / TODO: Add your command handler code herelong w,h;long i,j;w=m_DibHead-biWidth;h=m_DibHead-biHeight;unsigned char *lpdst=new unsigned charw*h;memset(lpdst,0,w*h);for(i=1;
6、ih-1;i+)for(j=1;jw-1;j+)int temp=*(m_Image+i*w-w+j-1)+*(m_Image+i*w-w+j)+*(m_Image+i*w-w+j+1)+*(m_Image+i*w+j-1)+*(m_Image+i*w+j)+*(m_Image+i*w+j+1)+*(m_Image+i*w+w+j-1)+*(m_Image+i*w+w+j)+*(m_Image+i*w+w+j+1);temp/=9;*(lpdst+i*w+j)=(unsigned char)(temp);memcpy(m_Image,lpdst,w*h);Invalidate();delete
7、 lpdst;滤波前后 添加一个:mysort函数在下拉菜单再建立一个新的菜单,打开属性给菜单一个ID号,修改标明为“中值滤波”,打开类向导,建立消息响应函数,实现图像中值滤波。添加的函数代码:void CGsmView:mysort(int a, int n) int i,j; int temp; for(i=0;in;i+) for(j=0;jaj+1) temp=aj; aj=aj+1; aj+1=temp; void CGsmView:OnZhongzhilvbo() / TODO: Add your command handler code here long w,h; long i
8、,j; w=m_DibHead-biWidth; h=m_DibHead-biHeight; unsigned char *lpdst=new unsigned charw*h; memset(lpdst,0,w*h); int arr9=0; for(i=1;ih-1;i+) for(j=1;jw-1;j+) int m,n; for(m=-3/2;m=3/2;m+) for(n=-3/2;nbiWidth; h=m_DibHead-biHeight; unsigned char *lpdst=new unsigned charw*h; memset(lpdst,0,w*h); for(i=
9、0;ih-1;i+) for(j=0;jbiWidth; h=m_DibHead-biHeight; unsigned char *lpdst=new unsigned charw*h; memset(lpdst,0,w*h); int sx,sy; for(i=1;ih-1;i+) for(j=1;jw-1;j+) sx=abs(*(m_Image+i*w+w+j-1)-*(m_Image+i*w-w+j-1)+ 2*(*(m_Image+i*w+w+j)-*(m_Image+i*w-w+j)+ *(m_Image+i*w+w+j+1)-*(m_Image+i*w-w+j+1); sy=ab
10、s(*(m_Image+i*w-w+j+1)-*(m_Image+i*w-w+j-1)+ 2*(*(m_Image+i*w+j+1)-*(m_Image+i*w+j-1)+ *(m_Image+i*w+w+j+1)-*(m_Image+i*w+w+j-1); *(lpdst+i*w+j)=(sx+sy); memcpy(m_Image,lpdst,w*h); Invalidate(); 锐化前后对比思考题1、 说明各种平滑方法对图像的操作结果有什么不同? 均值滤波基本思想是用几个像素灰度的平均值来代替每个像素的灰度,对抑制噪声是有效,但会产生模糊效应。中值滤波的特点是保护图象边缘的同时去除噪声。2、 说明哪一种锐化方法最好?为什么? Sobel算子法的锐化方法最好,因为在锐化的方法中,Sobel算子法由于引入平均,对图像中随机噪声有一定的平滑作用,边缘两侧元素得到加强,故边缘显得粗而亮。相比其它的方法,它对图形的边缘和灰度跳变部分有很好的加强效果。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1