当前位置:文档之家› 边缘保持滤波器

边缘保持滤波器

用公式表示为:
,或
三、实验代码
BOOL CBmpProcessView::EdgeFilter(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
//指向源图像的指针
LPSTRlpSrc;
//指向缓存图像的指针
LPSTRlpDst;
//指向缓存DIB图像的指针
LPSTRlpNewDIBBits;
*lpDst = (unsigned char)result;
}
}
//复制腐蚀后的图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
//释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
//返回
实验三 边缘保持滤波器
一、实验内容
本次实验需要根据课堂讲授知识,按照已知算法,在VC++6.0平台上编译图像边缘保持滤波处理的程序。边缘保持滤波是基于均值滤波和中值滤波的一种滤波器。该滤波器在滤除噪声脉冲的同时,又不至于使图像边缘过于模糊。
二、实验原理
边缘保持算法的基本过程如下:
对灰度图像的每一个像素点 取适当大小的一个邻域,分别计算 的左上角子邻域、左下角子邻域、右上角子邻域和右下角子邻域的灰度分布均匀度V,然后取最小均匀度对应区域的均值作为该像素点的新的灰度值。
HLOCALhNewDIBBits;
//循环变量
long i;
long j;
//像素值
double result;
unsigned char pixel[9];
//暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);
if (hNewDIBBits == NULL)
-(pixel[0]+pixel[1]+pixel[2]+pixel[3]+pixel[4]+pixel[5]+pixel[6]+pixel[7]+pixel[8])*(pixel[0]+pixel[1]+pixel[2]+pixel[3]+pixel[4]+pixel[5]+pixel[6]+pixel[7]+pixel[8])/9;
result = (pixel[0] * pixel[0] + pixel[1] * pixel[1] + pixel[2] * pixel[2] + pixel[3] * pixel[3]+pixel[4] * pixel[4]+ pixel[5] * pixel[5] + pixel[6] * pixel[6] + pixel[7] * pixel[7]+pixel[8] * pixel[8])
return T
边缘保持滤波处理效果(3×3邻域)
五、总结与分析
上次实验报告由于个人疏忽,未能将边缘保持滤波的相关文档提取,这次补上,望教员见谅、指正。
边缘保持滤波的处理效果不仅不像前几次做过的滤波效果,反而类似边缘检测的效果图。开始我以为是我的代码有问题,经过检查,我认为问题并不在程序上,这种效果就是边缘保持滤波的特点。
//指向目标图像第j行,第i个象素的指针
lpDst = (char *)lpNewDIBBits + lWidth * j + i;
//取得当前指针处3*3区域的像素值,注意要转换为unsigned char型
pixel[0] = (unsigned char)*(lpSrc - lWidth-1);
pixel[5] = (unsigned char)*(lpSrc - lWidth);
pixel[6] = (unsigned char)*(lpSrc + lWidth-1);
pixel[7] = (unsigned char)*(lpSrc - 1);
pixel[8] = (unsigned char)*lpSrc;
pixel[1] = (unsigned char)*(lpSrc - lWidth);
pixel[2] = (unsigned char)*(lpSrc - lWidth+1);
pixel[3] = (unsigned char)*(lpSrc + 1);
pixel[4] = (unsigned char)*(lpSrc + lWidth+1);
//使用水平方向的结构元素进行腐蚀
for(j = lHeight-2; j > 0; j--)
{
for(i = 1;i <lWidth-1; i++)
{
//由于使用3×3的模板,为防止越界,所以不处理最下边和最右边的两列像素
//指向源图像第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lWidth * j + i;
{
//分配内存失败
return FALSE;
}
//锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
//初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lWidth * lHeight);
相关主题