医学成像技术及图像处理Read.docx
《医学成像技术及图像处理Read.docx》由会员分享,可在线阅读,更多相关《医学成像技术及图像处理Read.docx(13页珍藏版)》请在冰点文库上搜索。
医学成像技术及图像处理Read
医学成像技术及图像处理
实验报告
几何均值滤波器
学生:
马亚红
学号:
3105037051
考核形式:
考查
实验日期:
2006.2
几何均值滤波器
一实验任务
几何均值滤波器
计算输入图像中大小为m*m的正方形区域的几何均值作为正方形区域中心点的滤波输出。
将这一过程遍历图像的每一像素位置,即可得到输出图像。
几何均值:
一个长度为N的序列各元素的乘积的N次方根。
本实验仅考虑m=n=2,3,4
三种正方形区域。
对于边缘上的点,正方形区域中超出图像边界的部分予以忽略。
以实验26**中的灰度图像PCB.bmp作为实验图像,在matlab中利用函数imnoise在图像中添加不同类型的噪声,试验滤波效果。
PCB.bmp原始图像
二设计程序
实验模块框图:
三源程序
1)matlab的加噪声程序
clearall;%变量清除
I=imread('PCB.bmp');%读入图片
I1=imnoise(I,'gaussian');%加入高斯噪声
v=zeros(300,420);%创建一个和原始图像大小相等的300*420的零矩阵
v=v+0.02;%给矩阵的每个元素加上因子0.02
I4=imnoise(I,'salt&pepper');%加入椒盐噪声
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:
implementationoftheCFilterclass.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*****文件名:
几何均值滤波器*************************************/
/*****文件功能:
计算输入图像中大小为m*m的正方形区域的几何均值作为/
/*****正方形区域中心点的滤波输出。
将这一过程遍历图像的每一像素位/
/*****置,即可得到输出图像。
***********************************/
/*****创建日期:
2006.2.01**************************************/
/*****作者:
马亚红**********************************************/
#include"stdafx.h"
#include"photostar.h"
#include"Filter.h"
#include"math.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFilter:
:
~CFilter()
{
}
CFilter:
:
CFilter(CImageObject*pImageObject,intiWinSize=3)
{
ASSERT(pImageObject!
=NULL);//声明m_pImageObject不得为空
m_iWinSize=iWinSize;
m_pImageObject=pImageObject;
}
BOOLCFilter:
:
GeometryFilter()
{
if(m_pImageObject==NULL)
{
returnFALSE;
}
intiWidth=m_pImageObject->GetWidth();//获取图像的宽度
intiHeight=m_pImageObject->GetHeight();//获取图像的高度
/*********************原始图像*******************/
unsignedchar*pOldBuffer,*pNewBuffer,*pOldBits,*pNewBits;
BITMAPFILEHEADER*pOldBFH,*pNewBFH;//新旧图像的文件头指针
BITMAPINFOHEADER*pOldBIH,*pNewBIH;//新旧图像的信息头指针
RGBQUAD*pOldPalette,*pNewPalette;//新旧图像的调色板指针
intnWidthBytes,nNumColors;
pOldBuffer=(unsignedchar*)m_pImageObject->GetDIBPointer(&nWidthBytes,
m_pImageObject->GetNumBits());
if(pOldBuffer==NULL)
{
returnFALSE;
}
pOldBFH=(BITMAPFILEHEADER*)pOldBuffer;
pOldBIH=(BITMAPINFOHEADER*)&pOldBuffer[sizeof(BITMAPFILEHEADER)];
nNumColors=m_pImageObject->GetNumColors();
pOldPalette=(RGBQUAD*)&pOldBuffer[sizeof(BITMAPFILEHEADER)+sizeof
(BITMAPINFOHEADER)];
pOldBits=(unsignedchar*)&pOldBuffer[sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
/**************************新图像************************/
DWORDdwNewSize;
HGLOBALhNewDib;
//Allocateagloabalmemoryblockforthenewimage
dwNewSize=sizeof(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());
returnFALSE;
}
//Getapointertoanewmemoryblock
pNewBuffer=(unsignedchar*):
:
GlobalLock(hNewDib);
if(pNewBuffer==NULL)
{
:
:
GlobalFree(hNewDib);
m_pImageObject->m_nLastError=IMAGELIB_MEMORY_LOCK_ERROR;
:
:
GlobalUnlock(m_pImageObject->GetDib());
returnFALSE;
}
pNewBFH=(BITMAPFILEHEADER*)pNewBuffer;
pNewBIH=(BITMAPINFOHEADER*)&pNewBuffer[sizeof(BITMAPFILEHEADER)];
pNewPalette=(RGBQUAD*)&pNewBuffer[sizeof(BITMAPFILEHEADER)+sizeof
(BITMAPINFOHEADER)];
pNewBits=(unsignedchar*)&pNewBuffer[sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
//Makeacopyoftheoldimage
memcpy(pNewBuffer,pOldBuffer,dwNewSize);
/******************************几何均值滤波*****************/
intamount=m_iWinSize*m_iWinSize;//m_iWinsize表示窗口的大小。
int*Template1=newint[amount];
for(intk=0;k{
Template1[k]=0;
}
//滤波开始点
intiX=m_iWinSize/2;//表示开始计算的点x坐标。
解决顶行不能计算的问题。
intiY=m_iWinSize/2;//表示开始计算的点的y坐标,解决顶行不能计算的问题。
//以下是几何均值滤波函数
inti,j,ii,jj;
//遍历图像的各个像素点
for(j=iY;j{
for(i=iX;i{
//遍历模板
for(jj=0;jj{
for(ii=0;ii{
Template1[jj*m_iWinSize+ii]=
pOldBits[(j-iY+jj)*nWidthBytes+(i-iX+ii)];
//将图像中窗口对应的像素值放进临时数组Template1中。
}
}
doublelongdTemp=1.0;
for(intk=0;k{
dTemp=dTemp*pow(Template1[k],1.0/(float)amount);
//循环体计算每个像素的1/n次方的值
}
//其中n=amount,表示窗口中共含有的元素个数。
这样计算可以避免因为窗口变大引起的dTemp存放不下太大数据的问题。
采用double型可以避免误差过大的问题。
pNewBits[(j)*nWidthBytes+i]=(unsignedchar)dTemp;
//将开方以后的结果赋值给对应像素点的值。
dTemp=1.0;
}
}
//释放原始图像的内存空间
:
:
GlobalUnlock(m_pImageObject->GetDib());
:
:
GlobalFree(m_pImageObject->GetDib());
//updatetheDIBintheobjectpointedbym_pImageObject
:
:
GlobalUnlock(hNewDib);
m_pImageObject->SetDib(hNewDib);
returnTRUE;
}
四.程序运行窗口
在VC++环境下运行上面的程序,我们就会看到以下的对话框,选择几何均值滤波器模板的大小后,点击按钮ok,及可出现处理后的图像。
五.实验结果
2×2模板3×3模板
2×2模板3×3模板
2×2模板3×3模板
六.结果分析与实验小结
通过上述罗列的部分试验结果,我们可以看到:
几何均值滤波器可以在一定程度上对噪声有抑制作用,起到图像增强的目的。
但是从处理结果中也可以看到它对椒盐噪声比较敏感,处理效果甚佳。
而对于高斯噪声和speckle噪声的抑制能力就比较差,还出现了边沿模糊的现象,导致一定程度上的高频失真。
另外,滤波器的模板大小也直接影响着滤波效果,因此我们在实验时应该对各个模板的滤波效果进行比较选取最优结果。
通过此次试验,对使用VC++处理图像有了进一步的了解与认识。
也熟练了使用VC++的技巧和调试程序的方法。
不足之处,由于时间原因,未能够与其他滤波效果进行比较。
滤波后的图像: