数字图像处理及分析实验五.docx
《数字图像处理及分析实验五.docx》由会员分享,可在线阅读,更多相关《数字图像处理及分析实验五.docx(13页珍藏版)》请在冰豆网上搜索。
数字图像处理及分析实验五
西华数学与计算机学院上机实践报告
课程名称:
计算机图形学
年级:
2011
上机实践成绩:
指导教师:
罗晓辉
姓名:
徐千
上机实践名称:
形态学变化
学号:
312011*********
上机实践日期:
2013.11.03
上机实践编号:
5
上机实践时间:
14:
00-18:
00
一、目的
理解腐蚀及膨胀的基本原理,掌握基本的生成腐蚀及膨胀算法,并实现腐蚀及膨胀的图片效果,利用C++实现腐蚀及膨胀的图片效果功能并处理图片效果。
二、内容与设计思想
内容:
(1)了解腐蚀及膨胀原理。
膨胀和腐蚀这两种操作是形态学处理的基础,许多形态学算法都是以这两种运算为基础的。
①膨胀
是以得到B的相对与它自身原点的映像并且由z对映像进行移位为基础的。
A被B膨胀是所有位移z的集合,这样,和A至少有一个元素是重叠的。
我们可以把上式改写为:
结构元素B可以看作一个卷积模板,区别在于膨胀是以集合运算为基础的,卷积是以算术运算为基础的,但两者的处理过程是相似的。
⑴用结构元素B,扫描图像A的每一个像素
⑵用结构元素与其覆盖的二值图像做“与”操作
⑶如果都为0,结果图像的该像素为0。
否则为1
②腐蚀
对Z中的集合A和B,B对A进行腐蚀的整个过程如下:
⑴用结构元素B,扫描图像A的每一个像素
⑵用结构元素与其覆盖的二值图像做“与”操作
⑶如果都为1,结果图像的该像素为1。
否则为0
腐蚀处理的结果是使原来的二值图像减小一圈。
(2)掌握基本的生成图像平滑、中值滤波以及拉普拉斯锐化算法
(3)利用C++分别实现生成图像平滑、中值滤波以及拉普拉斯锐化。
(4)利用该算法在屏幕上处理图片的效果。
设计思想:
腐蚀:
打开工作区,在图像处理实验算法下的CAView中ErosionDIB函数下编写程序
lpDIB指向源图像的指针
lpDIBBits指向源图像像素起始位置的指针
lWidth是图像宽度
lHeight是图像高度
首先读入原图像中的一个点(称为当前点)的像素值,并把缓存图象中对应位子的点赋为黑色.然后把结构元素(在此指定为1*3)”覆盖”在原图像中以当前点为中心的区域上,如果在结构元素中某点为黑色而下面原图像中对应的点为白色,则把缓存图像中当前点赋为白色,即腐蚀掉.这样将原图像中所有的点读入一遍,在缓存图像中就得到了原图像的腐蚀结果.注意,为了防止越界不处理最左边和最右边的两列像素.
膨胀:
打开工作区,在图像处理实验算法下的CAView中DilationDIB函数下编写程序
lpDIB指向源图像的指针
lpDIBBits指向源图像像素起始位置的指针
lWidth是图像宽度
lHeight是图像高度
膨胀运算和腐蚀运算类似,不同的是首先把缓存图像中的当前点赋为白色,而只要结构元素中某点和原图像中与之对应的点都为黑色,则把缓存图像中的当前点赋为黑色,即进行了膨胀.此处结构元素为1*3,为了防止越界不处理最左边和最右边的两列像素.
(4)仿照原理,编写代码,分别用膨胀运算和腐蚀运算处理图片。
(5)调试、编译、生成程序。
(6)处理图片。
三、使用环境
Microsoftvisualc++6.0
Windows7
四、核心代码及调试过程.(实验结果)
voidCAView:
:
OnMorphErosion()
{
//腐蚀运算
BackForUndo(GetDocument()->GetHDIB());
//获取文档
CADoc*pDoc=GetDocument();
//指向DIB的指针
LPSTRlpDIB;
//指向DIB象素指针
LPSTRlpDIBBits;
//锁定DIB
lpDIB=(LPSTR):
:
GlobalLock((HGLOBAL)pDoc->GetHDIB());
//更改光标形状
BeginWaitCursor();
//找到DIB图像象素起始位置
lpDIBBits=:
:
FindDIBBits(lpDIB);
//图像的宽度和高度
LONGlWidth;
LONGlHeight;
lWidth=:
:
DIBWidth(lpDIB);/*获取图像的"宽度"(4的倍数)*/
lHeight=:
:
DIBHeight(lpDIB);/*获取图像的高度*/
//调用ErosionDIB()函数腐蚀DIB
if(ErosionDIB(lpDIBBits,lWidth,lHeight))
{
//设置脏标记
pDoc->SetModifiedFlag(TRUE);
//更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
//提示用户
MessageBox("请检查程序");
}
//解除锁定
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
//恢复光标
EndWaitCursor();
}
BOOLCAView:
:
ErosionDIB(LPSTRlpDIBBits,LONGlWidth,LONGlHeight)
{
/********************
//DIB图像象素起始位置
LPSTRlpDIBBits;
//图像的宽度和高度
LONGlWidth;
LONGlHeight;
*************************/
//指向源图像的指针
LPSTRlpSrc;
//指向缓存图像的指针
LPSTRlpDst;
//指向缓存DIB图像的指针
LPSTRlpNewDIBBits;
HLOCALhNewDIBBits;
//循环变量
longi;
longj;
intm,n,flag;
//像素值
unsignedcharpixel;
//暂时分配内存,以保存新图像
hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);
if(hNewDIBBits==NULL)
{
//分配内存失败
returnFALSE;
}
//锁定内存
lpNewDIBBits=(char*)LocalLock(hNewDIBBits);
//初始化新分配的内存,设定初始值为255
lpDst=(char*)lpNewDIBBits;
memset(lpDst,(BYTE)255,lWidth*lHeight);
///////////////////////////////////////////////////
//使用水平方向的结构元素进行腐蚀
for(j=0;j{
for(i=1;i{
//由于使用1×3的结构元素,为防止越界,所以不处理最左边和最右边的两列像素
//指向源图像倒数第j行,第i个象素的指针
lpSrc=(char*)lpDIBBits+lWidth*j+i;
//指向目标图像倒数第j行,第i个象素的指针
lpDst=(char*)lpNewDIBBits+lWidth*j+i;
//取得当前指针处的像素值,注意要转换为unsignedchar型
pixel=(unsignedchar)*lpSrc;
//目标图像中的当前点先赋成黑色
*lpDst=(unsignedchar)0;
//如果源图像中当前点自身或者左右有一个点不是黑色,
//则将目标图像中的当前点赋成白色
flag=0;
for(m=0;m<3;m++)
for(n=0;n<3;n++)
{
pixel=*(lpSrc+(m-1)*lWidth+n-1);
if(pixel==255)
{
*lpDst=(unsignedchar)255;
flag=1;
}
if(flag==1)
break;
}
}
}
//复制腐蚀后的图像
memcpy(lpDIBBits,lpNewDIBBits,lWidth*lHeight);
//释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
//返回
returnTRUE;
}
voidCAView:
:
OnMorphDilation()
{
//膨胀运算
BackForUndo(GetDocument()->GetHDIB());
//获取文档
CADoc*pDoc=GetDocument();
//指向DIB的指针
LPSTRlpDIB;
//指向DIB象素指针
LPSTRlpDIBBits;
//锁定DIB
lpDIB=(LPSTR):
:
GlobalLock((HGLOBAL)pDoc->GetHDIB());
//更改光标形状
BeginWaitCursor();
//找到DIB图像象素起始位置
lpDIBBits=:
:
FindDIBBits(lpDIB);
//图像的宽度和高度
LONGlWidth;
LONGlHeight;
lWidth=:
:
DIBWidth(lpDIB);/*获取图像的"宽度"(4的倍数)*/
lHeight=:
:
DIBHeight(lpDIB);/*获取图像的高度*/
//调用DilationDIB()函数膨胀DIB
if(DilationDIB(lpDIBBits,lWidth,lHeight))
{
//设置脏标记
pDoc->SetModifiedFlag(TRUE);
//更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
//提示用户
MessageBox("请检查程序");
}
//解除锁定
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
//恢复光标
EndWaitCursor();
}
BOOLCAView:
:
DilationDIB(LPSTRlpDIBBits,LONGlWidth,LONGlHeight)
{
/********************
//DIB图像象素起始位置
LPSTRlpDIBBits;
//图像的宽度和高度
LONGlWidth;
LONGlHeight;
*************************/
//指向