3. morphologyEx()方法
3.1 morphologyEx()方法 介绍
在python中OpenCV还提供了morphologyEx()方法(形态学方法),可以用来完成所有常用的形态学运算。
morphologyEx()语法如下:
morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
其中
- scr 表示图像
- op 表示操作类型
- kernel 表示 核
- anchor 表示锚点
- iterations 为迭代次数,默认为1
- borderType 是边界样式,默认1
- borderValue 是边界值,默认1
可以供op选择的操作类型有:
参数值 |
描述 |
cv2.MORPH_ERODE |
腐蚀 |
cv2.MORPH_DILATE |
膨胀 |
cv2.MORPH_ OPEN |
开运算,先腐蚀后膨胀 |
cv2.MORPH_CLOSE |
闭运算,先膨胀后腐蚀 |
cv2.MORPH_GRADIENT |
梯度运算,膨胀图减腐蚀图 |
cv2.MORPH_TOPHAT |
顶帽运算,原始图减开运算图 |
cv2.MORPH_BLACKHAT |
黑帽运算,闭运算图,减开运算图 |
接下来我们使用图片"test2.jpg"(下图)来继续下边的示例:
3.2 梯度运算
对“test2.jpg”以 4 为核做梯度运算:
import cv2 import numpy as np img = cv2.imread("test2.jpg") k = np.ones((4, 4), np.uint8) dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, k) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()
梯度运算,即膨胀图减去腐蚀图,
因为膨胀运算得到的图像中我物体比原图中的“大”,而腐蚀运算得到的图像中的物体是收缩过的,比原图中的“小”,所以膨胀的结果减去腐蚀的结果,会得到一个大概的、不精准的轮廓。
test2.jpg梯度运算执行效果如下:
3.3 顶帽运算
对“test2.jpg”以 4 为核做顶帽运算:
import cv2 import numpy as np img = cv2.imread("test2.jpg") k = np.ones((4, 4), np.uint8) cv2.imshow("img", img) dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()
顶帽运算,即原图减去开运算图,
因为开运算抹除了图像的外部细节,所以顶帽运算即“有外部细节的图像 减去 无外部细节的图像”,得到的结果也就只剩外部细节了。
顶帽运算处理效果如下:
3.4 黑帽运算
对“test2.jpg”以 4 为核做顶帽运算:
import cv2 import numpy as np img = cv2.imread("test2.jpg") k = np.ones((4, 4), np.uint8) dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()
黑帽运算,即原图像的闭运算减去原图像
因为闭运算可以抹除图像的内部细节,所以黑帽运算即 “无内部细节的图像减去有内部细节的图像”,结果只剩下内部细节。
黑帽运算处理效果如下: