· 形态学操作主要包括:腐蚀,膨胀,开运算,闭运算,形态学梯度运算,顶帽运算,黑帽运算,击中击不中
腐蚀
将图像的边界点消除,使图像沿着边界向内收敛,也可以将小于指定结构体元素的部分去除
dst=cv2.erode(src,kernel,(-1,-1),迭代次数)
其中kernel可以自定义生成,也可以通过函数cv2.getStructuringElement()生成
import cv2
import numpy as np
img=np.zeros((5,5),dtype=np.uint8)
img[1:4,1:4]=1
print("img\n",img)
kernel=np.ones((3,1),np.uint8)
print("kernel\n",kernel)
rst=cv2.erode(img,kernel)
print("rst\n",rst)
img
[[0 0 0 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 0 0 0]]
kernel
[[1]
[1]
[1]]
rst
[[0 0 0 0 0]
[0 0 0 0 0]
[0 1 1 1 0]
[0 0 0 0 0]
[0 0 0 0 0]]
import cv2
import numpy as np
img=cv2.imread("D:/1.jpg")
kernel=np.ones((5,5),np.uint8)
rst=cv2.erode(img,kernel,iterations=2)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用更大的核,更多的迭代次数,图像腐蚀就越严重
膨胀
对图像的边界进行扩张,如果图像内两个对象的距离较近,那么在膨胀过程中,两个对象可能会连通在一起
dst=cv2.dilate(src,kernel,(-1,-1),迭代次数)
import cv2
import numpy as np
img=np.zeros((5,5),np.uint8)
img[2:3,1:4]=1
print("img\n",img)
kernel=np.ones((3,1),np.uint8)
print("kernel\n",kernel)
rst=cv2.dilate(img,kernel)
print("rst\n",rst)
img
[[0 0 0 0 0]
[0 0 0 0 0]
[0 1 1 1 0]
[0 0 0 0 0]
[0 0 0 0 0]]
kernel
[[1]
[1]
[1]]
rst
[[0 0 0 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 0 0 0]]
import cv2
import numpy as np
img=cv2.imread("D:/2.jpg")
kernel=np.ones((9,9),np.uint8)
rst=cv2.dilate(img,kernel)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()

通用形态学函数
dst=cv2.morphologyEx(src,op,kernel,(-1,-1),迭代次数)
其中op表示操作类型,有以下几种
- 腐蚀 cv2.MORPH_ERODE
- 膨胀 cv2.MORPH_DILATE
- 开运算 cv2.MORPH_OPEN
- 闭运算 cv2.MORPH_CLOSE
- 形态学梯度运算 cv2.MORPH_GRADIENT
- 顶帽运算 cv2.MORPH_TOPHAT
- 黑帽运算 cv2.MORPH_BLACKHAT
- 击中击不中 cv2.MORPH_HITMISS
开运算(先腐蚀后膨胀)
作用:去噪,计数
import cv2
import numpy as np
img=cv2.imread("D:/3.jpg")
kernel=np.ones((10,10),np.uint8)
rst=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel,iterations=1)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()


闭运算(先膨胀后腐蚀)
作用:关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接
import cv2
import numpy as np
img=cv2.imread("D:/4.jpg")
kernel=np.ones((5,5),np.uint8)
rst=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel,iterations=5)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()

形态学梯度运算(膨胀图像-腐蚀图像)
import cv2
import numpy as np
img=cv2.imread("D:/2.jpg")
kernel=np.ones((5,5),np.uint8)
rst=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel,iterations=2)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()

礼帽运算(原始图像-开运算图像)
作用:获取图像的噪声信息或者得到比原始图像边缘更亮的边缘信息
import cv2
import numpy as np
img=cv2.imread("D:/3.jpg")
kernel=np.ones((5,5),np.uint8)
rst=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel,iterations=2)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()


黑帽运算(闭运算图像-原始函数图像)
作用:获取图像内部的小孔,或者前景色中的小黑点,或者得到比原始图像的边缘更暗的边缘部分
import cv2
import numpy as np
img=cv2.imread("D:/hjb.jpg")
kernel=np.ones((5,5),np.uint8)
rst=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel,iterations=2)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()


核函数
对于kernel,可以自定义生成,也可以通过cv2.getStructuringElement()构造
retval=cv2.getStructuringElement(shape,kisze,(-1,-1))
- cv2.MORPH_RECT 矩形1
- cv2.MORPH_CROSS 十字形1
- cv2.MORPH_ELLIPSE 椭圆形1
观察不同的核
import cv2
import numpy as np
kernel1=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
kernel2=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
kernel3=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
print("kernel1:\n",kernel1)
print("kernel2:\n",kernel2)
print("kernel3:\n",kernel3)
kernel1:
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
kernel2:
[[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]
kernel3:
[[0 0 1 0 0]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[0 0 1 0 0]]
观察不同核对形态学操作的影响
import cv2
kernel1=cv2.getStructuringElement(cv2.MORPH_RECT,(59,59))
kernel2=cv2.getStructuringElement(cv2.MORPH_CROSS,(59,59))
kernel3=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(59,59))
img=cv2.imread("D:/3.jpg")
rst1=cv2.dilate(img,kernel1,iterations=1)
rst2=cv2.dilate(img,kernel2,iterations=1)
rst3=cv2.dilate(img,kernel3,iterations=1)
cv2.imshow("img",img)
cv2.imshow("rst1",rst1)
cv2.imshow("rst2",rst2)
cv2.imshow("rst3",rst3)
cv2.waitKey(0)
cv2.destroyAllWindows()

网友评论