大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。
一、 实验目的
分析掌握腐蚀与膨胀的基本原理,编写腐蚀与膨胀的算法,并掌握开闭运算的规则。
二、 实验内容
1. 实验任务
运用实验框架,正确编写图像腐蚀与膨胀的算法,并运用图像的开闭运算,实现图像的去“渣渣”与填“洞洞”。
2. 程序设计
1) 原理
①膨胀定义:把结构元素B平移a后得到Ba,若Ba击中X,则记下这个a点。所有满足上诉条件的a点组成的集合称为X被B膨胀的结果。膨胀处理的结果是使原来的图像增大一圈;
②腐蚀定义:把结构元素B平移a后得到Ba,若Ba包含于X,则记下这个a点。所有满足上诉条件的a点组成的集合称为X被B腐蚀的结果。腐蚀处理的结果是使原来的图像减小一圈。因为膨胀是腐蚀的对偶运算,所以在本实验中腐蚀运用的原理为:对白色膨胀就是对黑色腐蚀;
③开运算:先腐蚀后膨胀称为开运算,它用来消除小物体,在纤细点处分离物体,平滑较大物体的边界的同时,并不明显改变其面积;
④闭运算:先膨胀后腐蚀的过程称为闭运算,它用来填充物体内的细小空洞,连接邻近物体,平滑其边界的同时,并不明显改变其面积。
2) 流程
①打开VC++,打开工作空间,在DIB类中操作,只操作灰度图像;
②在DilationDIB函数的相应位置添加膨胀操作的代码。
③在ErosionDIB函数的相应位置添加腐蚀操作的代码。
④点击BuildExecute按钮,打开待操作的灰度图像。
⑤在形态学变换中分别进行膨胀和腐蚀,开运算和闭运算的操作。
3) 数据输出
结论:
腐蚀操作可以抹掉图像周围的小渣滓,膨胀操作可以填补图像中间的空洞,而开操作与闭操作结合使用可以实现图像的去“渣渣”与填“洞洞”。
三、 实验环境
- 操作系统:WINDOWS 8
- 开发工具:Visual Studio、
- 实验设备:PC
源代码
膨胀算法:
int flag = 0;
for(j=1;j<lHeight-1;j++)
{
for(i=1;i<lWidth-1;i++)
{
lpSrc=(char*)lpDIBBits+lWidth*j+i;
lpDst=(char*)lpNewDIBBits+lWidth*j+i;
pixel=(unsigned char)*lpSrc;
*lpDst=(unsigned char)255;
flag=0;
for(int m=0;m<3;m++)
{
for(n=0;n<3;n++)
{
pixel=*(lpSrc+(m-1)*lWidth+n-1);
if(pixel==0)
{
*lpDst=(unsigned char)0;
flag=1;
}
if(flag==1)
break;
}
}
}
}
腐蚀算法:
int flag = 0;
for(j=0;j<lHeight-1;j++)
{
for(i=1;i<lWidth-1;i++)
{
lpSrc=(char*)lpDIBBits+lWidth*j+i;
lpDst=(char*)lpNewDIBBits+lWidth*j+i;
pixel=(unsigned char)*lpSrc;
*lpDst=(unsigned char)0;
flag=0;
for(int m=0;m<3;m++)
{
for(n=0;n<3;n++)
{
pixel=*(lpSrc+(m-1)*lWidth+n-1);
if(pixel==255)
{
*lpDst=(unsigned char)255;
flag=1;
}
if(flag==1)
break;
}
}
}
}