《opencv实用探索·五》opencv小白也能看懂的图像腐蚀

本文介绍了图像腐蚀的基本原理,其在去除毛刺、边缘检测、噪声消除和信息提取等方面的应用,以及如何使用OpenCV库中的函数进行腐蚀操作。以Python代码示例展示了腐蚀过程和实际应用效果。

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

1、图像腐蚀原理简单理解:
腐蚀是形态学最基本的操作,都是针对白色部分(高亮部分)而言的。即原图像中高亮部分被蚕食,得到比原图更小的区域。

2、图像腐蚀的作用:
(1)去掉毛刺,去掉孤立的像素,提取骨干信息。
(2)边缘检测,膨胀和腐蚀可以提取二值图像中的边缘信息,通过先膨胀在腐蚀可以是边缘更加明显;
(3)去除噪声,二值图像中可能存在一些噪声点,或者孤立的像素点,通过一定次数的腐蚀操作可以消除孤立的像素点,通过一定次数的膨胀操作可以填充小的噪声点;
(4)提取信息,通过膨胀和腐蚀操作可以提取文本区域;

3、腐蚀的过程
用一个结构元素的中心覆盖原图像(二值图像只有0和1)的每个像素,看结构元素覆盖的原图像部分,取原图像中被覆盖部分像素的最小值替换被结构元素中心覆盖的原图像像素值。下面演示腐蚀过程:

(1)先定义一个结构元素(核元素),通常是正方形、十字和圆。以十字为例,如下图。
在这里插入图片描述
定义一个原图像如下图(灰色区域像素值都为1,白色区域像素值都为0):
在这里插入图片描述
现在把核中心放在第一个像素,如下图:
由于第一行第二列和第二行第一列都被核元素覆盖,并且这两个位置原图像像素值都为0,那么把0替换核中心覆盖的位置,即把原图像第一行第一列像素值置为0。
在这里插入图片描述
继续把核中心放在第二个像素,如下图:
原图像第一行第一列和第一行第二列都被核元素覆盖,且像素值都是0,核中心在第一行第二列,那么把原图像该位置置为0
在这里插入图片描述
用上面方法在原图像第一行被腐蚀后变为如下图样:
在这里插入图片描述
第二行就以第二行第三列位置的像素为例,把核元素覆盖上去,如下图:
这时候可以看到原图像被核元素覆盖的部分,每个元素最小值都是1,核元素中心位置即第二行第三列像素值置为1
在这里插入图片描述
最后通过上面的方法腐蚀原图像最终的效果如下:
在这里插入图片描述

4、opencv接口使用

该函数用于生成常用的结构元素图像。

Mat cv::getStructuringElement(int  shape,
                              Size  ksize,
                              Point  anchor = Point(-1,-1) 
                              )

shape:结构元素的种类,如下图
在这里插入图片描述
下图从左到右依次是矩形结构元素(腐蚀后的图像细节为矩形)、十字结构元素(腐蚀后的图像细节为十字)和椭圆结构元素(腐蚀后的图像细节为椭圆形):
在这里插入图片描述
矩形核使用场景:适用于大多数情况,在需要均匀缩小物体的情况下,可以考虑使用矩形核;
十字核使用场景:适用于连接断开的物体部分,例如去除小的断裂或连接一些窄的部分,有助于保留物体的纵向结构;
椭圆核使用场景:适用于处理具有方向性的物体,在处理一些非常小的或弯曲的物体时可能更有效。

ksize:结构元素的尺寸大小,一般情况下,结构元素的种类相同时,结构元素的尺寸越大腐蚀效果越明显。
anchor:中心点的位置,默认参数为结构元素的几何中心点。

该函数用于生成腐蚀后的图像。

void cv::erode(InputArray  src,
               OutputArray  dst,
               InputArray  kernel,
               Point  anchor = Point(-1,-1),
               int  iterations = 1,
               int  borderType = BORDER_CONSTANT,
               const Scalar &  borderValue = morphologyDefaultBorderValue() 
               )

src:输入的待腐蚀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
dst:腐蚀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
kernel:用于腐蚀操作的结构元素,可以自己定义,也可以用getStructuringElement()函数生成。
anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点
iterations:腐蚀的次数,默认值为1。腐蚀次数越多效果越明显。
borderType:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
borderValue:使用边界不变外推法时的边界值。

最后两个参数对图像中主要部分的腐蚀操作没有影响,因此在多数情况下使用默认值即可。
需要注意的是该函数的腐蚀过程只针对图像中的非0像素,如果图像注意以0像素为背景(背景基本黑色),那么腐蚀操作后会看到图像中的内容变得更瘦更小;如果图像是以255像素为背景(背景基本白色),那么腐蚀操作后会看到图像中的内容变得更粗更大。

案例使用:

int main(   )
{
	//载入原图  
	Mat srcImage = imread("1.jpg");
	//显示原图
	imshow("【原图】腐蚀操作", srcImage);
	//进行腐蚀操作 
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
	Mat dstImage;
	erode(srcImage, dstImage, element);
	//显示效果图 
	imshow("【效果图】腐蚀操作", dstImage);
	waitKey(0); 

	return 0;
}

效果如下:
原图像:
在这里插入图片描述

腐蚀后的图像:
在这里插入图片描述

在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦回阑珊

一毛不嫌多,一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值