膨胀 腐蚀 开闭运算

本文介绍了一种使用C++实现的图像处理方法,包括腐蚀和膨胀操作,并通过具体代码示例展示了如何进行开运算和闭运算。该方法适用于二值图像的预处理,能够有效地去除噪声并简化图像特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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();
}

  效果图:



注意:膨胀和腐蚀是对高亮部分(即白色)而言的:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值