凌顺
凌顺

目录

OpenCV Python 图像形态学操作

本示例使用的OpenCV版本是:OpenCV 4.1.1
运行Python的编辑器:Jupyter notebook 6.0.0

实现目的

在本教程中,您将学习如何应用于二进制图像的基本形态学操作。

实现代码

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,非黑即白。
具体请参考:
https://docs.opencv.org/4.1.1/d7/d1b/group__imgproc__misc.html#gae8a4a146d1ca78c626a53577199e9c57

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):将突出比原轮廓暗的部分。

具体用法请参考
https://docs.opencv.org/4.1.1/d4/d86/group__imgproc__filter.html#ga67493776e3ad1a3df63883829375201f

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()

file