#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();
}
效果图:
注意:膨胀和腐蚀是对高亮部分(即白色)而言的: