形态学图像处理
腐蚀和膨胀
腐蚀
原理:
假设原图像中有一个前景物体,那么我们用一个结构元素去腐蚀原图的过程是这样的:
遍历原图像的每一个像素,然后用结构元素的中心点对准当前正在遍历的这个像素,
然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最小值,用这个最小值替换当前像素值
应用场景:
1、删除图像中的某些部分
膨胀
原理:
假设原图像中有一个前景物体,那么我们用一个结构元素去膨胀原图的过程是这样的:
遍历原图像的每一个像素,然后用结构元素的中心点对准当前正在遍历的这个像素,
然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最大值,用这个最大值替换当前像素值。
应用场景:
1、修复图像中断裂字符
腐蚀是一种搜索和细化运算,而膨胀会“增长”或“粗化”二值图像中的目标。
import cv2 as cv
import numpy as np
file_path = r""
src = cv.imread(filename=file_path)
cv.namedWindow('input', cv.WINDOW_AUTOSIZE)
cv.imshow('input', src)
h, w = src.shape[:2]
kernel = np.ones(shape=[3, 3])
erode_img = cv.erode(src, kernel=kernel)
cv.imshow('erode', erode_img)
dilate_img = cv.dilate(erode_img, kernel, iterations=1)
cv.imshow('dilate', dilate_img)
cv.waitKey(0)
cv.destroyAllWindows()
开运算和闭运算
开运算
首先对图像腐蚀,然后再对腐蚀后的图像进行膨胀操作。
应用场景:
平滑物体的轮廓,断开狭窄狭颈,消除细长的突出物;
总结:
1、开运算除去孤立的小点,毛刺和小桥,总的位置和形状不变。
2、开运算一个基于几何运算的滤波器;
3、结构元素大小的不同将导致滤波效果的不同;
4、不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
闭运算
首先对图像膨胀,然后再对膨胀后的图像进行腐蚀操作。
应用场景:
平滑轮廓,弥合狭窄断裂和细长的沟壑,消除小孔,填补轮廓中的缝隙;
总结:
1、闭运算能够填平小孔,弥合小缝隙,而总的位置和形状不变;
2、闭运算通过填充图像的凹角来滤波图像;
3、结构元素大小不同将导致滤波效果不同;
4、不同结构元素选择导致了不同的分割。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r"C:\\Users\\Curry\\Desktop\\cc.png")
# img = cv2.cvtColor(img, code=cv2.COLOR_BGR2RGB)
kernel = np.ones(shape=[10, 10], dtype=np.uint8)
img = 255-img #黑变白,白变黑
# 开运算,先腐蚀,后膨胀
result_open = cv2.morphologyEx(img, op=cv2.MORPH_OPEN,
kernel=kernel, iterations=1)
# 闭运算.先膨胀,后腐蚀
result_close = cv2.morphologyEx(img, op=cv2.MORPH_CLOSE,
kernel=kernel, iterations=1)
plt.subplot(1,3,1)
plt.title('raw')
plt.imshow(img)
plt.subplot(1,3,2)
plt.title('monrph')
plt.imshow(result_open)
plt.subplot(1,3,3)
plt.title('monrph')
plt.imshow(result_close)
plt.show()