二值形态学基本运算实验报告一、实验目的1.掌握二值形态学的思想,进一步掌握图像处理和分析的实用算法;2.学会二值形态学的基本运算:膨胀、腐蚀、开启和闭合;3.掌握膨胀、腐蚀、开启和闭合的物理意义。二、实验原理(一)膨胀:A⨁B=⋃(𝐵)𝑎𝑎∈𝐴;(二)腐蚀:A⊖B={𝑥|(𝐵)𝑥⊆A};(三)开运算:A∘B=(A⊖B)⨁B;(四)闭运算:A⋅B=(A⨁B)⊝B;三、实验内容1.利用C++编程实现形态学的二值膨胀和二值腐蚀;2.利用C++编程实现形态学的二值开启运算(先腐蚀后膨胀)和二值闭合运算(先膨胀后腐蚀);四、实验框图1.膨胀NNYYYX(i,j)?=0N开始开辟内存y(new)y←图像矩阵数据xy(i-1,j)=0;y(i,j-1)=0;y(i+1,j)=0;y(i,j+1)x←yj=1i=0j255i255i++j++结束2.膨胀NNNYYYX(i,j)=0&x(i-1,j)=0&x(i,j-1)=0&x(i+1,j)=0&x(i,j+1)=0N开辟内存y(new)y(i,j)=255y(i,j)=0x←yj=0i=0j255i255i++j++结束开始3.开运算4.闭运算四、实验结果与分析开始调用腐蚀函数CImageProcessingDoc::Onimageerosion()调用膨胀函数CImageProcessingDoc::Onimagedilation()结束开始调用腐蚀函数CImageProcessingDoc::Onimageerosion()调用膨胀函数CImageProcessingDoc::Onimagedilation()结束图1原图图2二值化图3二值膨胀后图4二值腐蚀后图5开运算后图6闭运算后实验分析:从上面图可以看出:腐蚀可以消除图像中小的噪声区域,膨胀可以填补图像中的空洞、断断续续的线段等。开运算则平滑了图像轮廓,消除了细小的突起、孤立点但是也扩大了缝隙,分离由细线相连部分,消除细小的部分、在纤细点处分离部分、平滑较大部分的边界时不明显的改变其面积。闭运算则平滑边界,填充缝隙、孔洞和小断点,融合相邻的图象小块。五、实验程序段(具体见实验框架)1.膨胀:voidCImageProcessingDoc::Onimagedilation(){//TODO:Addyourcommandhandlercodehereintm_Width,m_Height,m_SaveWidth;m_Width=m_pDibInit-GetWidth();m_Height=m_pDibInit-GetHeight();m_SaveWidth=m_pDibInit-GetSaveWidth();inti,j;double*y=newdouble[m_Width*m_Height];for(j=0;jm_Height;j++){for(i=0;im_Width;i++){y[j*m_SaveWidth+i]=(m_pDibInit-m_pDibBits[j*m_SaveWidth+i]);}//将图像数据赋予新开辟内存空间}for(j=1;jm_Height;j++){for(i=0;im_Width;i++){if(m_pDibInit-m_pDibBits[j*m_SaveWidth+i]==0){y[j*m_SaveWidth+i-1]=0;y[j*m_SaveWidth+i+1]=0;y[(j-1)*m_SaveWidth+i]=0;y[(j+1)*m_SaveWidth+i]=0;}//十字架结构元素膨胀}}for(j=0;jm_Height;j++){for(i=0;im_Width;i++){m_pDibInit-m_pDibBits[j*m_SaveWidth+i]=int(y[j*m_SaveWidth+i]);}}deletey;//释放内存y=NULL;UpdateAllViews(NULL);}2.腐蚀:voidCImageProcessingDoc::Onimageerosion(){//TODO:Addyourcommandhandlercodehereintm_Width,m_Height,m_SaveWidth;m_Width=m_pDibInit-GetWidth();m_Height=m_pDibInit-GetHeight();m_SaveWidth=m_pDibInit-GetSaveWidth();inti,j;double*y=newdouble[m_Width*m_Height];for(j=1;jm_Height;j++)//将图像数据赋予新开辟内存空间{for(i=1;im_Width;i++){y[j*m_SaveWidth+i]=255;}//画一幅全白图像}for(j=0;jm_Height;j++){for(i=0;im_Width;i++)//十字架结构元素腐蚀{if((m_pDibInit-m_pDibBits[j*m_SaveWidth+i-1]==0)&&(m_pDibInit-m_pDibBits[j*m_SaveWidth+i+1]==0)&&(m_pDibInit-m_pDibBits[(j-1)*m_SaveWidth+i]==0)&&(m_pDibInit-m_pDibBits[(j+1)*m_SaveWidth+i]==0)&&(m_pDibInit-m_pDibBits[j*m_SaveWidth+i]==0))y[j*m_SaveWidth+i]=0;}}for(j=0;jm_Height;j++){for(i=0;im_Width;i++){m_pDibInit-m_pDibBits[j*m_SaveWidth+i]=int(y[j*m_SaveWidth+i]);}}deletey;//释放内存y=NULL;UpdateAllViews(NULL);}3.开运算:voidCImageProcessingDoc::Onimageopening(){//TODO:AddyourcommandhandlercodehereCImageProcessingDoc::Onimageerosion();//先调用二值腐蚀CImageProcessingDoc::Onimagedilation();//再调用二值膨胀}4.闭运算:voidCImageProcessingDoc::Onimageclosing(){//TODO:AddyourcommandhandlercodehereCImageProcessingDoc::Onimagedilation();//先调用二值膨胀CImageProcessingDoc::Onimageerosion();//再调用二值腐蚀}