美文网首页
形态学操作

形态学操作

作者: Tsukinousag | 来源:发表于2021-10-13 14:15 被阅读0次

· 形态学操作主要包括:腐蚀,膨胀,开运算,闭运算,形态学梯度运算,顶帽运算,黑帽运算,击中击不中

腐蚀

将图像的边界点消除,使图像沿着边界向内收敛,也可以将小于指定结构体元素的部分去除

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()

相关文章

网友评论

      本文标题:形态学操作

      本文链接:https://www.haomeiwen.com/subject/yhssoltx.html