也是这几天做项目才理解到,原来膨胀腐蚀还可以利用线条模板和圆的模板去做,之前都是使用矩形模板去做的。
先介绍一下opencv中膨胀腐蚀经常用到的函数: cv2.erode()/cv2.dilate()/cv2.morphologyEx()
我们经常直接如下方式使用上面的函数。
- 第一个参数:需要处理的二值化后的图片
- 第二个参数:kernel,可以设置为None,也可以自己设置一个kernel,可以是矩形、圆形、线性等。(就看你想提取那种类型的物体了)
- 第三个参数:迭代次数
dilate_img = cv2.dilate(thresholdImg, None, iterations=3)
erode_img = cv2.erode(dilate_img, None, iterations=3)
关于kernel的设计,可以用下面这个函数,也可以用自己设计
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
如果是想自己生成模板,举个例子,生成圆的模板,可以如下:
r = 7
kernel = np.zeros((r, r), np.uint8)
cv2.circle(kernel, (int(r / 2), int(r / 2)), int(r / 2), 1, -1)
举例说明一下
需要处理的图片如下:
import cv2
import numpy as np
"""直线膨胀腐蚀"""
img = cv2.imread("pic.png", 0)
t, thresholdImg = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
element_heng = cv2.getStructuringElement(cv2.MORPH_RECT, (40, 1))
element_shu = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 40))
heng = cv2.morphologyEx(thresholdImg, cv2.MORPH_OPEN, element_heng)
shu = cv2.morphologyEx(thresholdImg, cv2.MORPH_OPEN, element_shu)
cv2.imshow("shu", shu)
cv2.imshow("heng", heng)
cv2.waitKey(0)
处理的结果如下所示
当然,上面是使用了opencv的内置函数去生成模板,也可以自己手写一个
import cv2
import numpy as np
"""直线膨胀腐蚀"""
img = cv2.imread("pic.png", 0)
t, thresholdImg = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
kernel1 = np.ones((1, 40), np.uint8)
kernel2 = np.ones((40, 1), np.uint8)
heng = cv2.morphologyEx(thresholdImg, cv2.MORPH_OPEN, kernel1)
shu = cv2.morphologyEx(thresholdImg, cv2.MORPH_OPEN, kernel2)
cv2.imshow("shu", shu)
cv2.imshow("heng", heng)
cv2.waitKey(0)
后面如果有新的理解,再做补充吧,欢迎评论区交流~
|