本示例使用的OpenCV版本是:OpenCV 4.1.1
运行Python的编辑器:Jupyter notebook 6.0.0
实现目的
在本教程中,您将学习如何使用Opencv应用于二进制图像的基本形态学操作获取图像基本形态。
实现代码
1,加载库,以灰度读取图片,并显示
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('dog.png',0)
plt.imshow(img, cmap='gray')
2,使用Otsu的方法构建二进制图像
_, binary = cv2.threshold(img, -1, 1, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.threshold()的作用是固定阈值二值化,例如是设定某个阀值,低于为0,高于为1,非黑即白。
具体请参考:OpenCV threshold函数
3,使用3×3矩形蒙版施加腐蚀和膨胀10次
eroded = cv2.morphologyEx(binary, cv2.MORPH_ERODE, (3, 3), iterations=10)
dilated = cv2.morphologyEx(binary, cv2.MORPH_DILATE, (3, 3), iterations=10)
cv2.morphologyEx() 函数是一种形态学变化函数。数学形态学可以理解为一种滤波行为,因此也称为形态学滤波。滤波中用到的滤波器(kernal),在形态学中称为结构元素。结构元素往往是由一个特殊的形状构成,如线条、矩形、圆等。
开运算(open):先腐蚀后膨胀的过程。开运算可以用来消除小黑点,在纤细点处分离物体、平滑较大物体的边界的 同时并不明显改变其面积。
闭运算(close):先膨胀后腐蚀的过程。闭运算可以用来排除小黑洞。
形态学梯度(morph-grad):可以突出团块(blob)的边缘,保留物体的边缘轮廓。
顶帽(top-hat):将突出比原轮廓亮的部分。
黑帽(black-hat):将突出比原轮廓暗的部分。
具体用法请参考:OpenCV morphologyEx函数
4,使用类似椭圆的5×5结构元素进行5次形态学打开和关闭操作
opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN,
cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)),
iterations=5)
closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE,
cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)),
iterations=5)
5,计算形态梯度
grad = cv2.morphologyEx(binary, cv2.MORPH_GRADIENT,cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)))
6,查看各种结果
plt.figure(figsize=(10,8))
plt.subplot(231)
plt.axis('off')
plt.title('binary')
plt.imshow(binary, cmap='gray')
plt.subplot(232)
plt.axis('off')
plt.title('erode 10 times')
plt.imshow(eroded, cmap='gray')
plt.subplot(233)
plt.axis('off')
plt.title('dilate 10 times')
plt.imshow(dilated, cmap='gray')
plt.subplot(234)
plt.axis('off')
plt.title('open 5 times')
plt.imshow(opened, cmap='gray')
plt.subplot(235)
plt.axis('off')
plt.title('close 5 times')
plt.imshow(closed, cmap='gray')
plt.subplot(236)
plt.axis('off')
plt.title('gradient')
plt.imshow(grad, cmap='gray')
plt.tight_layout()
plt.show()