getStructuringElement函数以及开、闭、腐蚀、膨胀原理讲解

cv2.getStructuringElement()函数的作用是返回一个结构元素(卷积核),具体解析如下:

kernel = cv2.getStructuringElement(a,b,c): # 得到一个结构元素(卷积核)。主要用于后续的腐蚀、膨胀、开、闭等运算。
因为这些运算都是依赖于卷积核的,不同的卷积核(形状、大小)对图形的腐蚀、膨胀操作效果不一样

输入参数:
 		a设定卷积核的形状、b设定卷积核的大小、c表示描点的位置,一般 c = 1,表示描点位于中心。(下文细说)
返回值:
 		返回指定形状和尺寸的结构元素(一般是返回一个矩形)、也就是腐蚀/膨胀用的核的大小。(下文细说)

a取不同的参数会导致卷积核有不同的形状,a参数有三个:
①:MORPH_RECT(函数返回矩形卷积核)
②:MORPH_CROSS(函数返回十字形卷积核)
③:MORPH_ELLIPSE(函数返回椭圆形卷积核)

b:用一个(x,y)的形式表示,表示卷积核有x行,y列。

腐蚀操作
①:腐蚀操作的对象是二值化图像,二值图像前景物体为1,背景为0,卷积核也是只含有0和1。
②:比如这是图像A和一个卷积核(结构元素):
在这里插入图片描述

(注意A的像素点(方格)不是0就是1。B的描点(中心点)就是我们通过getStructuringElement函数中的参数c来确定的,也可以设立在其他地方)

腐蚀的步骤就是用卷积核B的描点(此处就是中心点),来对齐A中的每一个小方格,然后选取卷积核B的方格中的数据的最小值,意思就是当B的描点对齐A的边界方格的时候,那么B的其他四个方格可能位于A图像中的0像素点,那么最小值就是0,那么就把卷积核B的描点对应的A中的小方格设为0,这就导致使用腐蚀操作后,我我们能看到的白色区域减少的原因。

kernel = cv2.getStructuringElement(a,b,c)
cv2.erode(img, kernel, iteration = 1)# 腐蚀操作

膨胀操作
原理与腐蚀操作一样,只不过是取最大像素值,其他地方没差别。

kernel = cv2.getStructuringElement(a,b,c)
cv2.dilate(img, kernel, iteration = 1)# 膨胀操作

开、闭
开:先进行腐蚀运算,再进行膨胀运算。
闭:先进行膨胀运算,再进行腐蚀运算。

kernel = cv2.getStructuringElement(a,b,c)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN,kernel) # 开运算
opening = cv2.morphologyEx(ima,cv2.MORPH_CLOSE,lernel) # 闭运算

开运算和闭运算都是处理噪点用的:
开:消去一个黑图中的很多小白点
闭:小区一个白图中的很多小黑点 如:

原图:
在这里插入图片描述
开运算:
在这里插入图片描述
闭运算:
在这里插入图片描述

  • 42
    点赞
  • 229
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在图像处理中,膨胀腐蚀运算和运算是常用的基本操作,JavaCV提供了相关的方法实现。 1. 膨胀 膨胀是将目标物体的边界向外扩张,使它变宽变厚,可以用于填补空洞、连接断点等操作。 ```java int kernelSize = 5; // 卷积核大小 Mat kernel = getStructuringElement(MORPH_RECT, new Size(kernelSize, kernelSize)); // 创建一个矩形卷积核 Mat dilatedImage = new Mat(); dilate(image, dilatedImage, kernel); // 对图像进行膨胀操作 ``` 2. 腐蚀 腐蚀是将目标物体的边界向内收缩,使它变窄变细,可以用于消除小的干扰、分离物体等操作。 ```java int kernelSize = 5; // 卷积核大小 Mat kernel = getStructuringElement(MORPH_RECT, new Size(kernelSize, kernelSize)); // 创建一个矩形卷积核 Mat erodedImage = new Mat(); erode(image, erodedImage, kernel); // 对图像进行腐蚀操作 ``` 3. 运算 运算是先进行腐蚀操作,再进行膨胀操作,可以用于消除小的干扰、断物体之间的细连接等操作。 ```java int kernelSize = 5; // 卷积核大小 Mat kernel = getStructuringElement(MORPH_RECT, new Size(kernelSize, kernelSize)); // 创建一个矩形卷积核 Mat openedImage = new Mat(); morphologyEx(image, openedImage, MORPH_OPEN, kernel); // 对图像进行运算 ``` 4. 运算 运算是先进行膨胀操作,再进行腐蚀操作,可以用于填补小的空洞、连接物体之间的细连接等操作。 ```java int kernelSize = 5; // 卷积核大小 Mat kernel = getStructuringElement(MORPH_RECT, new Size(kernelSize, kernelSize)); // 创建一个矩形卷积核 Mat closedImage = new Mat(); morphologyEx(image, closedImage, MORPH_CLOSE, kernel); // 对图像进行运算 ``` 以上是JavaCV中实现膨胀腐蚀运算的基本方法,需要根据实际需求选择适合的操作和参数。 ### 回答2: 膨胀腐蚀是图像处理中常用的一对基本操作,用来改变图像的形状和结构。而运算则是对膨胀腐蚀的组合运算,用来改善图像的细节。 膨胀操作是将图像中的物体边缘进行扩张,使其变得更加粗壮。它是通过将图像中的每个像素与邻域内的像素进行比较,并选择其中最亮的像素作为结果像素来实现的。膨胀操作可以用来填充图像中的小缺口,连接图像中的不连续轮廓,以及扩大图像中的物体。 腐蚀操作与膨胀相反,它将图像中的物体边缘进行收缩,使其变得更加细化。腐蚀操作是通过将图像中的每个像素与邻域内的像素进行比较,并选择其中最暗的像素作为结果像素来实现的。腐蚀操作可以用来去除图像中的小噪点,分离图像中相连的物体,以及缩小图像中的物体。 运算是先腐蚀膨胀的组合操作,它可以用来去除图像中的毛刺和细小结构、平滑图像的边缘。运算则是先膨胀腐蚀的组合操作,它可以用来填充图像中的小洞和断裂,平滑图像中物体的边界。运算可以进一步强调图像中物体的形状和结构特征,提取出感兴趣的图像区域。 在JavaCV中,可以使用OpenCV库提供的函数来实现膨胀腐蚀运算和运算操作。这些函数可以直接在图像上操作,实现图像的形态学处理。利用这些函数,我们可以对图像进行膨胀腐蚀运算,从而改变图像的形状和结构,提取出我们感兴趣的图像内容。 ### 回答3: 膨胀腐蚀是图像处理中常用的一对基本操作,可以通过改变图像的形态特征来实现一些特定的图像处理任务。 膨胀操作是将图像中的亮像素扩张,使其周围的像素也变成亮像素。膨胀操作可以使目标物体变大,或者填充一些空洞。在javacv中,可以使用dilate函数实现膨胀操作。该函数接受图像矩阵和结构元素作为参数,返回经过膨胀操作后的图像。 腐蚀操作是将图像中的亮像素收缩,使其周围的像素也变成暗像素。腐蚀操作可以使目标物体变小,或者去除一些噪声。在javacv中,可以使用erode函数实现腐蚀操作。同样,该函数接受图像矩阵和结构元素作为参数,返回经过腐蚀操作后的图像。 运算是先进行腐蚀操作,再进行膨胀操作。运算可以去除小物体、平滑较大物体的边界,并且保留较大物体的形态特征。在javacv中,可以使用函数morphologyEx来实现运算操作。 运算是先进行膨胀操作,再进行腐蚀操作。运算可以填充小空洞、平滑较小物体的边界,并且保留较小物体的形态特征。同样地,在javacv中,可以使用函数morphologyEx来实现运算操作。 总结来说,通过使用膨胀腐蚀运算等操作,可以对图像进行形态学处理,改变其形态特征,实现一些特定的图像处理任务。在javacv中,可以使用相应的函数来进行这些操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值