1, 腐蚀
卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值均是 1, 那么中心元素就保持原来的像素值虽否则就变为0。
import cv2
import numpy as np
from matplotlib import pyplot as plt
def show(imgs, titles):
j = 121
for i in range(len(imgs)):
plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
plt.xticks([]), plt.yticks([])
j = j +1
plt.show()
if __name__ == '__main__':
img = cv2.imread('./jing.jpg', cv2.IMREAD_UNCHANGED)
kernel = np.ones((9,9),np.uint8)
out = cv2.erode(img, kernel,iterations=1)
show([img, out], ['original', 'erode'])
erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
| 参数 |
含义 |
| src |
输入图片 |
| kernel |
卷积核 |
| dst |
|
| anchor |
内核的基准点(anchor) |
| iterations |
迭代次数 (即erode多次运算) |
| borderType |
对外边界计算类型 |
2, 膨胀
卷积核沿着图像滑动,如果与卷积核对应的原图像的像素值有为 1, 那么中心元素就为1
import cv2
import numpy as np
from matplotlib import pyplot as plt
def show(img):
cv2.imshow('aa', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
img = cv2.imread('./jing.jpg', cv2.IMREAD_GRAYSCALE)
show(img)
kernel = np.ones((9,9),np.uint8)
out = cv2.dilate(img, kernel,iterations=4)
show(out)
dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
形态学运算的变种
| 参数 |
含义 |
| src |
输入图片 |
| kernel |
卷积核 |
| dst |
|
| anchor |
内核的基准点(anchor) |
| iterations |
迭代次数 (即erode多次运算) |
| borderType |
对外边界计算类型 |
| borderValue |
|
3,morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
| 参数 |
含义 |
| src |
输入图片 |
| op |
运算类型 |
| kernel |
卷积核 |
| dst |
|
| anchor |
内核的基准点(anchor) |
| iterations |
迭代次数 (即erode多次运算) |
| borderType |
对外边界计算类型 |
| borderValue |
|
op
| 取值 |
含义 |
| cv2.MORPH_OPEN |
开运算:先腐蚀, 后膨胀, 用于去除噪音 |
| cv2.MORPH_CLOSE |
闭运算:先膨胀, 后腐蚀, 用来填充前景物体中的小洞, 或者前景物体上的小黑点。 |
| cv2.MORPH_GRADIENT |
形态学梯度 |
| cv2.MORPH_TOPHAT |
礼帽: 原图与开运算的差(src-open) |
| cv2.MORPH_BLACKHAT |
黑帽: 进行闭运算之后得到的图像与原始图像的差。(close-src) |
import cv2
import numpy as np
from matplotlib import pyplot as plt
def show(img):
cv2.imshow('aa', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
img = cv2.imread('./jing.jpg', cv2.IMREAD_GRAYSCALE)
show(img)
kernel = np.ones((9,9),np.uint8)
out = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
show(out)
4, 结构化元素
之前我们使用的结构化元素(理解为卷积核形状), 但是有时我们需要构建圆形或者椭圆形的核, 我们就需要使用opencv提供的函数来构建卷积核 cv2.getStructuringElement()。
getStructuringElement(shape, ksize, anchor=None)
构建结构化元素(卷积核)
| 参数 |
含义 |
| shape |
结构化元素的形状 |
| ksize |
卷积核大小 |
| anchor |
内核的基准点(anchor) |
shape
| 取值 |
含义 |
| cv2.MORPH_CROSS |
十字形卷积核 |
| MORPH_RECT |
矩形卷积核 |
| MORPH_ELLIPSE |
椭圆卷积核 |