膨胀 腐蚀 开闭运算

    xiaoxiao2026-08-16  0

    #include"iostream" #include"opencv2/opencv.hpp" using namespace cv; using namespace std; void Erode(uchar *src,uchar *dst,uchar *a,int nWidth,int nHeight,int StructW,int StructH) // { //腐蚀 和结构元素不为0的 都相同则留下 int i,j,l,m; int k=0; int flg=1; for(i=0;i<nWidth*nHeight;i++) { dst [i]=0; } for(i=StructH/2;i<nHeight-StructH+StructH/2;i++) for(j=StructW/2;j<nWidth-StructW+StructW/2;j++) { k=0; flg=1; for(l=-StructH/2;l<StructH/2+1;l++) { for(m=-StructW/2;m<StructW/2+1;m++) { if(a[k++]==0) continue; else { if(src[(i+l)*nWidth+(j+m)]!=255) { flg=0; break; } } } //end last for if(flg==0) { break; } if(k==StructH*StructW) //k如约到了所有的循环 说明满足了所有 { dst [(i)*nWidth+(j)]=255; // //这里注意啊 是当前像素不用*(dst+(i+l)*nWidth+(j+m)) } } //end for } } void Dilation(uchar *src,uchar *dst,uchar *a,int nWidth,int nHeight,int StructW,int StructH) { int i,j,l,m; int k=0; for(i=0;i<nWidth*nHeight;i++) { dst[i]=0; } int flg=1; for(i=StructH/2;i<nHeight-StructH+StructH/2;i++) for(j=StructW/2;j<nWidth-StructW+StructW/2;j++) { k=0; flg=1; for(l=-StructH/2;l<StructH/2+1;l++) { for(m=-StructW/2;m<StructW/2+1;m++) { if(a[k++]==0) continue; else { if(*(src+(i+l)*nWidth+(j+m))!=0) //只要有一个满足就可以了 { flg=0; *(dst+(i)*nWidth+(j))=255; //这里注意啊 是当前像素不用*(dst+(i+l)*nWidth+(j+m)) break; } } } if(flg==0) { break; } } } } void open(uchar *src,uchar *dst,uchar *a,int nWidth,int nHeight,int StructW,int StructH) { Mat tmp1; tmp1.create(nHeight,nWidth,CV_8UC1); Erode(src,tmp1.data,a,nWidth,nHeight,StructW,StructH); Dilation(tmp1.data,dst,a,nWidth,nHeight,StructW,StructH); } void close(uchar *src,uchar *dst,uchar *a,int nWidth,int nHeight,int StructW,int StructH) { Mat tmp; tmp.create(nHeight,nWidth,CV_8UC1); Dilation(src,tmp.data,a,nWidth,nHeight,StructW,StructH); Erode(tmp.data,dst,a,nWidth,nHeight,StructW,StructH); } void main() { Mat SrcImg=imread("C:\\Users\\Administrator\\Desktop\\工作\\testp\\test1.jpg",0); threshold(SrcImg,SrcImg,100,255,THRESH_BINARY_INV); uchar Struct[9]={ 0,1,0, 1,1,1, 1,1,1 }; //uchar Struct[25]={ // 1,1,1,1,1, // 1,1,1,1,1, // 1,1,1,1,1, // 0,0,1,1,1, // 0,0,1,1,1 //}; Mat OutImg; OutImg.create(SrcImg.rows,SrcImg.cols,SrcImg.type()); //Erode(SrcImg.data,OutImg.data,Struct,SrcImg.cols,SrcImg.rows,5,5); //Dilation(SrcImg.data,OutImg.data,Struct,SrcImg.cols,SrcImg.rows,5,5); //open(SrcImg.data,OutImg.data,Struct,SrcImg.cols,SrcImg.rows,3,3); //open(OutImg.data,OutImg.data,Struct,SrcImg.cols,SrcImg.rows,3,3); close(SrcImg.data,OutImg.data,Struct,SrcImg.cols,SrcImg.rows,3,3); //close(OutImg.data,OutImg.data,Struct,SrcImg.cols,SrcImg.rows,3,3); imshow("src",SrcImg); imshow("out",OutImg); waitKey(); }

      效果图:

    注意:膨胀和腐蚀是对高亮部分(即白色)而言的:
    转载请注明原文地址: https://ju.6miu.com/read-1311230.html
    最新回复(0)