数字图像处理及分析实验五.docx

上传人:b****6 文档编号:3263117 上传时间:2022-11-21 格式:DOCX 页数:13 大小:143.94KB
下载 相关 举报
数字图像处理及分析实验五.docx_第1页
第1页 / 共13页
数字图像处理及分析实验五.docx_第2页
第2页 / 共13页
数字图像处理及分析实验五.docx_第3页
第3页 / 共13页
数字图像处理及分析实验五.docx_第4页
第4页 / 共13页
数字图像处理及分析实验五.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数字图像处理及分析实验五.docx

《数字图像处理及分析实验五.docx》由会员分享,可在线阅读,更多相关《数字图像处理及分析实验五.docx(13页珍藏版)》请在冰豆网上搜索。

数字图像处理及分析实验五.docx

数字图像处理及分析实验五

西华数学与计算机学院上机实践报告

课程名称:

计算机图形学

年级:

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;

*************************/

//指向

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1