11. 形态学--膨胀、腐蚀、开闭运算、梯度、顶帽、黑帽

1. 形态学-腐蚀

腐蚀是元素全为1的卷积核
方法:
erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

  • iterations是腐蚀操作的迭代次数,次数越多,腐蚀操作执行的次数越多,腐蚀效果越明显
import cv2
import numpy as np

img = cv2.imread('./msb.png')
kernel = np.ones((3, 3), np.uint8)
dst = cv2.erode(img, kernel, iterations=2)
cv2.imshow('img', np.hstack(img, dst))
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 形态学-膨胀

dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

# 使用cv2提供的函数获取形态学卷积核:MORPH_RECT,CROSS,ELLIPSE等
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))  # 膨胀卷积核选择类型
# 膨胀操作
dst = cv2.dilate(img, kernel)
cv2.imshow('img', np.hstack(img, dst))

3. 获取形态学卷积核

cv提供了获取卷积核的API,不需要我们手动创建卷积核
getStructuringElement(shape, ksize[, anchor])

  • shape是指卷积核的形状,注意不是指长宽,是指卷积核中1形成的形状
    (1) MORPH_RECT 卷积核中的1是矩形,常用;
    (2) MORPH_MORPH_ELLIPSE 椭圆
    (3) MORPH_CROSS 十字
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
# 在使用腐蚀或膨胀的时候,作为卷积核使用
cv2.erode(img, kernel, iterations=2)

4. 开运算

  • 开运算和闭运算都是腐蚀和膨胀的基本应用
  • 开运算 = 腐蚀 + 膨胀
  • morphologyEx(img, cv2.MORPH_OPEN, kernel)
    cv2.MORPH_OPEN 表示形态学的开运算
    kernel 如果噪声点比较多,会选择大一点的kernel,如果噪声点比较小,可以选择小一点的kernel

5. 闭运算

  • morphologyEx(img, cv2.MORPH_CLOSE, kernel)

6. 形态学-梯度

  • 梯度 = 原图 - 腐蚀
  • 腐蚀之后原图边缘变小了,原图 - 腐蚀 就可以得到腐蚀掉的部分,即边缘
  • morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 注意调节kernel大小以获得更清晰的边缘
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, iterations=1)

7. 顶帽操作

  • 顶帽 = 原图 - 开运算
  • 开运算的效果是去除图像外的噪点,原图 - 开运算就得到了去掉的噪点
  • morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

8. 黑帽操作

  • 顶帽 = 原图 - 闭运算
  • 闭运算的效果是去除图像内的噪点,原图 - 开运算就是图形内部的噪点
  • morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
posted @ 2022-06-26 20:45  理舞  阅读(228)  评论(0编辑  收藏  举报