图像腐蚀、膨胀算法

本文详细介绍了图像处理中的腐蚀和膨胀运算,包括定义、算法流程及编程实现,并附带了具体的代码示例。

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

腐蚀运算的含义:每当在目标图像中找到一个与结构元素相同的子图像时,就把该子图像中与结构元素的原点位置对应的那个像素位置标注出来,目标图像上被标注出来的所有像素组成的集合,即为腐蚀运算的结果。其实质就是在目标图像中标出那些与结构元素相同的子图像的原点位置的像素。


算法描述:

1.获得源图像每行像素的宽度

2.创建一幅大小与源图像相同,所有像素置黑的目标图像

3.为防止越界,不处理最左边、最右边、最上边和最下边的像素,从第2行、第2列开始检查源图像中的像素点,先将当前点在目标图像中的对应像素点置白,如果当前点对应结构元素中为白色的那些点中有一个不是白色,则将目标图像中的对应像素点置为黑。

4.循环3步骤,直至处理完源图像

5.所得的目标图像即为腐蚀结果

编程实现:

结构元素为3*3的全置白矩阵,输入图像为二值图像

void corrode(Mat &img,uchar mask[3][3],int m,int n)//img为源图像,mask为结构元素,m,n为结构元素的大小
{
	int width = img.cols;//源图像每行像素的宽度
	Mat k(img.size(), img.type(), Scalar::all(0)); //创建一幅大小与源图像相同,所有像素置黑的目标图像
	for (int i = 1; i < img.rows-1; i++)
	{
		uchar *data = img.ptr<uchar>(i);
		uchar *k_mask = k.ptr<uchar>(i);
		for (int j = 1; j < img.cols - 1; j++)
		{
			if (*data > 100)
			{
				k_mask[j] = 255;//先将当前点在目标图像中的对应像素点置白
				for (int ii = 0; ii < m; ii++)
				{
					for (int jj = 0; jj < n; jj++)
					{
						if (mask[ii][jj] == 0)
							continue;
						uchar flag = *(data + (ii - 1)*width + (jj - 1));
						if (flag < 100)
						{
							k_mask[j] = 0;//如果当前点对应结构元素中为白色的那些点中有一个不是白色,则将目标图像中的对应像素点置为黑 o9  
							break;

						}
					}
				}
			}
			data++;
		}
	}
	img = k;
}
int main()
{
	uchar mask[3][3];
	for (int i = 0; i < 3; i++) 
		for (int j = 0; j < 3; j++)
		{
			mask[i][j] = 255;
		}
	while (1)
	{
		Mat img = imread("5.jpg", 0);
		imshow("显示1", img);
		threshold(img, img, 240, 255, 0);
		imshow("源图像", img);
		corrode(img,mask,3,3);
		imshow("腐蚀效果", img);
		waitKey(10);
	}
    return 0;
}


效果:


膨胀运算的含义:先对结构元素B做关于其原点的反射得到反射集合B^,然后在目标图像X上将B^平移x,则那些B^平移后与目标图像X至少有一个非零公共元素相交时,对应的原点位置所组成的集合就是膨胀运算的结果。


算法描述:

1.获得源图像每行像素的宽度

2.创建一幅大小与源图像相同,所有像素置黑的目标图像

3.为防止越界,不处理最左边、最右边、最上边和最下边的像素,从第2行、第2列开始检查源图像中的像素点,如果当前点对应结构元素中为白色的那些点中只要有一个点是白色,则将目标图像中的当前像素点置为白。

4.循环3步骤,直至处理完源图像

5.所得的目标图像即为膨胀结果

编程实现:

结构元素为3*3的全置白矩阵,输入图像为二值图像

void expand(Mat &img, uchar mask[3][3], int m, int n)
{
	int width = img.cols;//源图像每行像素的宽度
	Mat k(img.size(), img.type(), Scalar::all(0)); //创建一幅大小与源图像相同,所有像素置黑的目标图像
	for (int i = 1; i < img.rows - 1; i++)
	{
		uchar *data = img.ptr<uchar>(i);
		uchar *k_mask = k.ptr<uchar>(i);
		for (int j = 1; j < img.cols - 1; j++)
		{
			bool flag = 0;
			for (int ii = 0; ii < m; ii++)
			{
				for (int jj = 0; jj < n; jj++)
				{
					if (*(data + (ii - 1)*width + (jj - 1)) != 0 && mask[ii][jj] != 0)
					{
						*k_mask = 255;
						flag = 1;
						break;
					}
				}
				if (flag == 1) break;
			}
			k_mask++;
			data++;
		}
	}
	img = k;
}


int main()
{
	uchar mask[3][3];
	for (int i = 0; i < 3; i++) 
		for (int j = 0; j < 3; j++)
		{
			mask[i][j] = 255;
		}
	while (1)
	{
		Mat img = imread("5.jpg", 0);
		imshow("显示1", img);
		threshold(img, img, 240, 255, 0);
		imshow("源图像", img);
		expand(img,mask,3,3);
		imshow("膨胀效果", img);
		waitKey(10);
	}
    return 0;
}
效果:




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值