1、医学成像技术及图像处理实 验 报 告几何均 值滤 波器学生: 马亚红学号: 3105037051考核形式: 考 查 实验 日期: 2006.2几何均 值滤 波器一 实验任务 几何均值滤波器计算输入图像中大小为 m*m 的正方形区域的几何均值作为正方形区域中心点的滤波输出。将这一过程遍历图像的每一像素位置,即可得到输出图像。几何均值:一个长度为 N 的序列各元素的乘积的 N 次方根。本实验仅考虑 m=n=2,3,4三种正方形区域。 对于边缘上的点,正方形区域中超出图像边界的部分予以忽略。以实验 26*中的灰度图像 PCB.bmp 作为实验图像,在 matlab 中利用函数 imnoise 在图像
2、中添加不同类型的噪声,试验滤波效果。PCB . bmp 原始图像二 设计程序实验模块框图:在 MATLAB 里面调用imread 函数读入 PCB 原图像调用 imnoise 函数加入各类噪声将加入噪声的图像读入 VC+进行滤波得到滤波处理后的图像三 源程序1) matlab 的加噪声程序clear all; %变量清除I=imread(PCB.bmp); %读入图片I1=imnoise(I,gaussian); % 加入高斯噪声v=zeros(300,420); % 创建一个和原始图像大小相等的 300*420 的零矩阵v=v+0.02; % 给矩阵的每个元素加上因子 0.02I4=imno
3、ise(I,salt %加入椒盐噪声I5=imnoise(I,speckle); %加入 speckle 噪声figure(1),imshow(I1);title(加入高斯噪声的图像); figure(4),imshow(I4);title(加入焦盐噪声的图像);figure(5),imshow(I5);title(加入 speckle 噪声的图像);2) VC+实现几何均值滤波器的源程序特别说明:该实验是在本科毕业设计已经做好的框架 photostar 上添加的代码。/ Filter.cpp: implementation of the CFilter class./*文件名:几何均值滤波器
4、*/*文件功能:计算输入图像中大小为 m*m 的正方形区域的几何均值作为/*正方形区域中心点的滤波输出。将这一过程遍历图像的每一像素位 /*置,即可得到输出图像。*/*创建日期:2006.2.01*/*作者:马亚红*/#include “stdafx.h“#include “photostar.h“#include “Filter.h“#include “math.h“#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endif/ Construction/Destruction/CF
5、ilter:CFilter()CFilter:CFilter(CImageObject *pImageObject,int iWinSize=3)ASSERT(pImageObject!=NULL); /声明 m_pImageObject 不得为空m_iWinSize=iWinSize;m_pImageObject=pImageObject;BOOL CFilter:GeometryFilter()if(m_pImageObject=NULL)return FALSE;int iWidth=m_pImageObject-GetWidth();/获取图像的宽度int iHeight=m_pIma
6、geObject-GetHeight();/获取图像的高度/*原始图像*/unsigned char*pOldBuffer,*pNewBuffer,*pOldBits,*pNewBits;BITMAPFILEHEADER*pOldBFH,*pNewBFH;/新旧图像的文件头指针BITMAPINFOHEADER*pOldBIH,*pNewBIH;/新旧图像的信息头指针RGBQUAD*pOldPalette,*pNewPalette;/新旧图像的调色板指针int nWidthBytes,nNumColors;pOldBuffer=(unsigned char*)m_pImageObject-Get
7、DIBPointer(if(pOldBuffer=NULL)return FALSE; pOldBFH=(BITMAPFILEHEADER*)pOldBuffer;pOldBIH=(BITMAPINFOHEADER*)nNumColors=m_pImageObject-GetNumColors();pOldPalette=(RGBQUAD*)pOldBits=(unsigned char*)/*新图像*/DWORD dwNewSize;HGLOBAL hNewDib;/Allocate a gloabal memory block for the new imagedwNewSize=size
8、of(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)+nWidthBytes*(m_pImageObject-GetHeight();hNewDib=:GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwNewSize);if(hNewDib=NULL)m_pImageObject-m_nLastError=IMAGELIB_MEMORY_ALLOCATION_ERROR;:GlobalUnlock(m_pImageObject-GetDib();return FALSE
9、;/Get a pointer to a new memory blockpNewBuffer=(unsigned char*):GlobalLock(hNewDib);if(pNewBuffer=NULL):GlobalFree(hNewDib);m_pImageObject-m_nLastError=IMAGELIB_MEMORY_LOCK_ERROR;:GlobalUnlock(m_pImageObject-GetDib();return FALSE;pNewBFH=(BITMAPFILEHEADER*)pNewBuffer;pNewBIH=(BITMAPINFOHEADER*)pNew
10、Palette=(RGBQUAD*)pNewBits=(unsigned char*)/Make a copy of the old imagememcpy(pNewBuffer,pOldBuffer,dwNewSize);/*几何均值滤波 */int amount=m_iWinSize*m_iWinSize; /m_iWinsize 表示窗口的大小。int *Template1=new intamount;for(int k=0;kGetDib();:GlobalFree(m_pImageObject-GetDib();/update the DIB in the object pointe
11、d by m_pImageObject:GlobalUnlock(hNewDib);m_pImageObject-SetDib(hNewDib);return TRUE;四程序运行窗口在 VC+环境下运行上面的程序,我们就会看到以下的对话框,选择几何均值滤波器模板的大小后,点击按钮 ok,及可出现处理后的图像。五实验结果22 模板 33 模板22 模板 33 模板22 模板 33 模板六结果分析与实验小结通过上述罗列的部分试验结果,我们可以看到:几何均值滤波器可以在一定程度上对噪声有抑制作用,起到图像增强的目的。但是从处理结果中也可以看到它对椒盐噪声比较敏感,处理效果甚佳。而对于高斯噪声和 speckle 噪声的抑制能力就比较差,还出现了边沿模糊的现象,导致一定程度上的高频失真。另外,滤波器的模板大小也直接影响着滤波效果,因此我们在实验时应该对各个模板的滤波效果进行比较选取最优结果。通过此次试验,对使用 VC+处理图像有了进一步的了解与认识。也熟练了使用 VC的技巧和调试程序的方法。不足之处,由于时间原因,未能够与其他滤波效果进行比较。