基于Python的Opencv学习

基于Python的Opencv学习第八天

各位小伙伴大家好,今天我们来学习一下opencv中的形态学操作的相关内容,一起来看一下吧!

一.图像腐蚀

1.图像腐蚀的概念
说到图像腐蚀,见字之意,即将一个大的部分腐蚀成一个小的部分,看一下下面的图片就可以了解清楚在这里插入图片描述
这里右侧白的小圆部分就是经过大圆的腐蚀而成的,即丢失了他的边缘,从而变小。

来看官网里面介绍腐蚀的例子:
在这里插入图片描述
这里我们可以看到这个原始图像经过腐蚀之后他的边缘变得更细了。
来认识一下腐蚀:

1.腐蚀属于形态学转换,主要针对的是二值图像
2.有两个输入对象:
对象1:二值图像(0代表黑色,1代表白色)
对象2:卷积核

在进行腐蚀的时候,我们使用卷积核,卷积核是一个类似N*N的矩阵,我们在腐蚀过程中是利用卷积核的中心点逐个像素扫描原始图像在这里插入图片描述
在这里插入图片描述
如图,黑白色区域就是我们需要腐蚀的图像,而红色区域就是我们的卷积核(真实中为黑色,黄色点为卷积核的中心),我们就是通过黄色点来进行像素的比较,被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,这个像素值保留为1,当卷积核对应元素既含1又含0时,则将像素值置为0(即由白变黑)。

2.图像腐蚀的函数erode()
在图像腐蚀中使用的函数是erode(),具体语法如下:

dst=cv2.erode(src,kernel,iterations)

dst:处理结果
相应参数:
src:原图像
kernel:卷积核
iterations:迭代次数

对于卷积核我们是需要生成一个NN的矩阵,需要用**np.ones((N,N),np.uint8)**这里的NN是生成矩阵的大小,至于那个np.uint8是生成矩阵的类型。

这里卷积核已经介绍了,至于这个迭代次数就是指我们需要进行腐蚀的次数,如果进行多次腐蚀就需要将这个参数填写相应的数字。默认情况下不写为迭代一次。

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
k=np.ones((5,5),np.uint8)
b=cv2.erode(a,k)
cv2.imshow("a",a)
cv2.imshow("b",b)

在这里插入图片描述
这里我们看到腐蚀的结果,由于是腐蚀一次,导致结果不是很明显,来看一下多次腐蚀的结果:
在这里插入图片描述
这是腐蚀了10次的结果这时候图片已经不成个样子了(笑哭)

二.图像膨胀

1.图像膨胀的概念
现在我们介绍一下图像膨胀,图像膨胀和图像腐蚀互为逆操作选取黑色为背景色,白色为前景色,膨胀就是给前景色边缘变大(如果黑色为前景色,则又不同,黑色的前景色边缘会变小)在这里插入图片描述
在这里插入图片描述
这两幅图都是由原始图像经过膨胀操作后得到的图像,可以清楚的看到图像的边缘变粗。

膨胀操作的作用:我们一般利用膨胀操作来进行去噪,在刚刚讲图像腐蚀的时候可以看到,图像经过了腐蚀操作后,去除了噪声,但是会压缩图像,如果我们再对腐蚀过的图像进行膨胀处理,可以去除噪声,并保持原有的形状。在这里插入图片描述
这幅三幅图像我们可以看到,周围的毛刺已经被去除,但是那个字母“J”经过除噪之后在经过膨胀得到了原图像相同的大小,这个过程也被称为“开运算”。

和腐蚀一样,我们来认识一下膨胀:

①膨胀操作的形态学转换主要针对的是二值图像
②由两个输入对象:
对象1:二值图像
对象2:卷积核

膨胀操作中的卷积核和腐蚀操作中的作用原理和效果均相同(通过卷积核的中心点逐个像素扫描原始图像)在这里插入图片描述
如左图,如果卷积核里面既含有1,又含有0,则该卷积核中心点的像素值置为1,如果两者均为0(或1),则像素值保留为0(或1)。

2.图像膨胀的函数dilate()

dst=cv2.dilate(src,kernel,iterations)

dst:处理结果
相关参数:
src:原图像
kernel:卷积核(需要调用np.ones()函数)
iterations:迭代次数

这些在腐蚀操作里面已经详细讲述,就不再赘述。

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
k=np.ones((5,5),np.uint8)
b=cv2.erode(a,k,iterations=5)
c=cv2.dilate(b,k,iterations=10)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("c",c)

在这里插入图片描述
这里图像经历了腐蚀操作后再次经历了膨胀操作,腐蚀迭代次数为5次,膨胀迭代次数是10次,得到如下效果图。

二.开运算

1.开运算的概念
一个原图像经过腐蚀处理再经过膨胀处理后就是开运算。

如果我们通过上述调用腐蚀和膨胀两次函数可以实现类似开运算的效果,但是在opencv中开运算有其自己的函数和相应的作用:

开运算(image)=膨胀(腐蚀(image))
在这里插入图片描述
这是官网提供的开运算的例子,即去噪处理。

2.开运算的函数 morphologyEx()

opening=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

opening:开运算结果
具体参数含义:
img:原图像
cv2.MORPH_OPEN:开运算(这个参数是固定的,是一个常量)
kernel:卷积核(同上述腐蚀膨胀)

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
k=np.ones((5,5),np.uint8)
b=cv2.morphologyEx(a,cv2.MORPH_OPEN,k)
cv2.imshow("a",a)
cv2.imshow("b",b)

在这里插入图片描述
这里看出我的原图片没有噪声需要去除,所以结果发现没有改变,接下来我们看另一个经过开运算的结果比较直观。在这里插入图片描述

四.闭运算

1.闭运算的概念
与腐蚀,膨胀的关系一样,闭运算是开运算的逆运算

闭运算是先膨胀,后腐蚀,从而得到闭运算的结果。
闭运算有助于关闭前景物体内部的小孔,或物体上的小黑点,从而达到类似去噪的处理。
在这里插入图片描述
在这里插入图片描述
这个可以看到已经去除了图像内部的小黑点。
闭运算(image)=腐蚀(膨胀(image))
在这里插入图片描述
这是官网上的例子,可以看到原图像里面的小黑点已经被去除。

2.闭运算函数morphologyEx()

closing=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

这里的函数不再解释含义。

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
k=np.ones((5,5),np.uint8)
b=cv2.morphologyEx(a,cv2.MORPH_CLOSE,k)
cv2.imshow("a",a)
cv2.imshow("b",b)

在这里插入图片描述
这里是经过闭运算的结果,可以看出有一点点的变化。
在这里插入图片描述
这里可以直观看出闭运算的结果。

今天给大家介绍了四种形态学操作,分别是腐蚀,膨胀,开运算,闭运算,具体解释已经写的很详细了,只要弄懂卷积核的知识就可以明白这四种形态学操作,函数很简单,参数只要正确填写即可。

OK,今天就到这里,我们下一篇博客见(转载注明出处)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值