形态学处理方法听起来很高大上,实际计算过程很容易,本人觉得比较难的是如何把各个方法对应的处理效果记住。在此整理了学习过程中的一些技巧。废话少说。
腐蚀
腐蚀操作时取每一个位置的矩形邻域内值的最小值作为该位置的输出灰度值。这里的邻域可以是矩形结构,也可以是椭圆形结构、十字交叉形结构等,这个结构被定义为结构元,实际上就是个01二值矩阵。
举个例子
给定一个矩阵,也就是我们要做处理的图像
,
以及一个十字交叉结构元
在对
点出的灰度做处理时,也就是对21这个点做处理时,要在其十字形邻域内找最小值,赋值给
点。示意图如下。
从图中也可以很容易的看出,腐蚀操作将灰度值降低了,也就是说腐蚀后的输出图像总体亮度比原图有所降低,图像中比较亮的区域面积会变小,比较暗的区域面积增大。
腐蚀,可以联想到浓硫酸腐蚀,浓硫酸会让木头、纸腐蚀,最后变黑。
膨胀
膨胀相当于是腐蚀反向操作,图像中较亮的物体尺寸会变大,较暗的物体尺寸会减小。还是相同的例子,在21的十字邻域内找最大值,最大值为234,将234赋值到这个位置。
膨胀如何记忆,我想到了一个动图,大家可以参考一下
锅中的白色物体膨胀后,画面中的较亮区域尺寸会变大,相应的较暗区域尺寸变小。
先来看一下腐蚀和膨胀的代码
import
开运算
开运算是先腐蚀后膨胀,可以消除亮度较高的细小区域,而且不会明显改变其他物体区域的面积。
至于如何记忆,我还没有想到,评论区可以交流一波
闭运算
闭运算与开运算相反,先膨胀后腐蚀。可以消除细小黑色空洞,也不会明显改变其他物体区域面积。
欲使其自闭,必先让其膨胀
代码部分
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 因为图像太大,做运算效果不明显,所以先resize到小尺寸
img = cv2.resize(cv2.imread('img.jpg', 0), (150, 100))
# 得到一个5x5的矩形结构元
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
iterations = 10 # 执行开闭运算的次数
open_res = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations)
close_res = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations)
plt.subplot(1,3,1)
plt.imshow(open_res, cmap=plt.cm.gray)
plt.title("open 10 iter")
plt.subplot(1,3,2)
plt.imshow(img, cmap=plt.cm.gray)
plt.title("img")
plt.subplot(1,3,3)
plt.imshow(close_res, cmap=plt.cm.gray)
plt.title("close 10 iter")
plt.show()