OpenCV学习之路(八)图像的形态学转换(腐蚀,膨胀,开、闭运算,梯度运算,礼帽,黑帽)

形态学操作是对图像形状进行的操作,一般情况下是对二值化图像进行的操作,两个基本的形态学操作是腐蚀和膨胀。
在这里插入图片描述

腐蚀

腐蚀操作很容易理解,与生活中的腐蚀意义一样,生活中的东西在腐烂的时候,总是会从边缘开始由外向内腐蚀。就是这个意思。

原理

使用卷积核遍历图像像素值,以卷积核的中心为中心,如果与卷积核对应的像素值全为1(即全是白色),像素值就保持不变。否则与卷积核对应的像素值就全变为0。也就体现出了边缘都被腐蚀掉的情形。
在这里插入图片描述
从图中很容易看出腐蚀的过程。前景区被腐蚀掉。

构造函数:
cv2.erode(src,kernel,iterations)

参数解释:

  • src:一般情况是一个二值图像,像素值只有0和1。
  • kernel:即我们自己定义的卷积核,可以使用numpy定义
  • iterations:进行腐蚀操作的次数,默认为1。如果觉得腐蚀效果不好,可以多腐蚀几次。
import numpy as np
import cv2
img=cv2.imread('D://zopencv//ball.jpg',cv2.IMREAD_GRAYSCALE)
ret,mask=cv2.threshold(img,127,255,cv2.THRESH_BINARY)#转换为二值图片,不转也行
kernel=np.ones((5,5),np.uint8)
mask1=cv2.erode(mask,kernel)
cv2.imshow('mask',mask1)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

膨胀

膨胀与腐蚀恰好是两个相反的操作,腐蚀是白色向内收缩,膨胀则是白色向外扩张。
在这里插入图片描述

原理

一个我们自定义的卷积核以卷积核中心为中心遍历整幅图像,如果与卷积核对应的像素值只要有1,就全为1。否则是0。

构造函数
cv2.dilate(src,kernel,iteration)
import numpy as np
import cv2
img=cv2.imread('D://zopencv//pengzhang.png',cv2.IMREAD_GRAYSCALE)
ret,mask=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
kernel=np.ones((5,5),np.uint8)
mask1=cv2.dilate(mask,kernel,iterations=8)
cv2.imshow('mask',mask1)
cv2.waitKey(0)
cv2.destroyAllWindows()

开运算

先进行腐蚀在进行膨胀的操作就叫做开运算

开运算(image)=膨胀(腐蚀(image))

开运算常用来去除图片中的噪声。腐蚀可以把噪声去掉,但是图像也被压缩了,所以我们需要膨胀来使图像恢复原样

构造函数:
cv2.morphologyEx(src,op,kernel)
  • op:函数执行的操作类型,op参数我们要写cv2.MORPH_OPEN
    才是开运算。

闭运算

不用多说,闭运算是先进行膨胀在进行腐蚀。常用来填补前景物中的黑点。
在这里插入图片描述

mask1=cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel)

梯度运算

这种方法常常用来获取图像的轮廓。
梯度运算实际上就是膨胀-腐蚀

梯度运算(image)=膨胀(image)-腐蚀(image)

函数:

mask1=cv2.morphologyEx(mask,cv2.MORPH_GRADIENT,kernel)

在这里插入图片描述

礼帽

礼帽运算(image)=原图(image)- 开运算(image)

所以礼帽运算得到的实际上是噪声图像。
在这里插入图片描述
函数:

mask1=cv2.morphologyEx(mask,cv2.MORPH_TOPHAT,kernel)

黑帽

黑帽运算(image)=闭运算(image)-原图(image)

实际得到的是前景图中的黑点和小洞
在这里插入图片描述
函数:

mask1=cv2.morphologyEx(mask,cv2.MORPH_BLACKHAT,kernel)
发布了63 篇原创文章 · 获赞 101 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览