目录
一 基本的数学形态学操作
1 膨胀
2 腐蚀
3 开运算
4 闭运算
二 实践
(1)代码
(2)结果图
形态学图像处理的基本思想是基于结构元素来处理图像,该方法适用于图像处理的各个方面。
基本的数学形态学操作有:膨胀和腐蚀。二值膨胀和腐蚀运算是形态学图像处理的基础,它们互为对偶运算(逆运算)。
膨胀和腐蚀的组合操作有:开运算、闭运算、击中或击不中变换。
其中,击中或击不中变换在这里不作介绍。
在二值图像中,膨胀(Dilation)是对对象进行“加长”或“变粗”的操作。膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程,可以用来填补物体中的“空洞”,具有扩大图像的作用,在一定程度上影响了目标区域的形状。结构元素的集合控制二值图像变粗的方式和程度。
腐蚀(Erosion)是对二值图像中的对象进行“收缩”或“细化”的操作,是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。像在膨胀中的作用一样,结构元素控制收缩的方式和程度。
先腐蚀后膨胀的过程称为开运算(Opening)。开运算是可以用来消除小物体、去除细小的噪声、断开狭窄的连接、平滑较大物体的边界的同时并不明显改变其面积的运算。开运算完全删除了不包含结构元素的对象区域。
与开运算相同的是,形态学闭运算可以平滑对象的轮廓,与开运算不同的是,闭运算会将狭窄的缺口连接起来形成细长的口,并且填充物体内部比结构元素小的孔洞。
import cv2
import matplotlib.pyplot as plt
import numpy as np
def dealImageResult(img_path):
img = cv2.imread(img_path)
RGBImage = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Gaussian = cv2.GaussianBlur(grayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
Binary = cv2.adaptiveThreshold(Gaussian, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, -2)
kernel_1 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) #矩形
# 腐蚀
eroded = cv2.erode(Binary, kernel_1)
# 膨胀
dilated = cv2.dilate(Binary, kernel_1)
# 设置卷积核
kernel_open = np.ones((3, 3), np.uint8)
# 图像开运算
open_result = cv2.morphologyEx(Binary, cv2.MORPH_OPEN, kernel_open)
# 闭运算
close_kernel = np.ones((3, 3), np.uint8)
close_result = cv2.morphologyEx(Binary, cv2.MORPH_CLOSE, close_kernel)
fig = plt.figure(figsize=(10, 10))
titles = ["img", "grayImage", "Binary", "eroded", "dilated", "open", "close"]
images = [RGBImage, grayImage, Binary, eroded, dilated, open_result, close_result]
for i in range(7):
plt.subplot(3, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
dealImageResult("test.png")
pass