7 形态学操作
7.1 腐蚀
- cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
import cv2
import numpy as np
#传入二值图像
img = imread('./img.png')
#卷积核越大,腐蚀范围越大
kernel = np.ones((5, 5), np.uint8)
#iterations:表示迭代几次,即执行几次腐蚀操作
erosion = cv2.erode(img, kernel, iterations=1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.2 膨胀
- cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
import cv2
import numpy as np
#传入二值图像
img = imread('./img.png')
kernel = np.ones((5, 5), np.uint8)
#iterations:表示迭代几次,即执行几次膨胀操作
dilate = cv2.dilate(img, kernel, iterations=1)
cv2.imshow('dilate', dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
膨胀与腐蚀可以相互弥补。
7.3 开运算与闭运算
- cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
- 由参数op选择进行开闭运算
- 开运算:先腐蚀,后膨胀
- 闭运算:先膨胀,后腐蚀
import cv2
import numpy as np
#传入二值图像
img = imread('./img.png')
kernel = np.ones((5, 5), np.uint8)
#开运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#闭运算
closing = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.4 梯度计算
跟开闭运算的API相同,还是op发生了改变.
- cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
- 梯度 = 膨胀 - 腐蚀
import cv2
import numpy as np
#传入二值图像
img = imread('./img.png')
kernel = np.ones((5, 5), np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.5 礼帽与黑帽
- cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
- 礼帽 = 原始输入 - 开运算结果
- 黑帽 = 闭运算 - 原始输入
import cv2
import numpy as np
#传入二值图像
img = imread('./img.png')
kernel = np.ones((5, 5), np.uint8)
#礼帽
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
#黑帽
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('hat', np.hstack((tophat, blackhat)))
cv2.waitKey(0)
cv2.destroyAllWindows()