图像的侵蚀与膨胀
这篇教学会介绍两种 OpenCV 的图像形态学处理:侵蚀 ( Erosion ) 和膨胀 ( Dilation ),透过这两种处理方式,能够实现去除噪声或是連接破碎景物的功能。
快速导览:
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
什么是侵蚀 ( Erosion )?
当空间中有兩个集合 ( A 集合和 B 集合 ),当 A 集合的部分空间被 B 集合所取代,则称之为“侵蚀 ( Erosion )”,通常进行侵蚀后的图像,黑色区域会扩张,白色区域会缩小。
什么是膨胀 ( Dilation )?
当空间中有兩个集合 ( A 集合和 B 集合 ),当 A 集合的部分空间扩张到 B 集合,则称之为“膨胀 ( Dilation )”,通常进行膨胀后的图像,白色区域会扩张,黑色区域会缩小。
如何使用侵蚀与膨胀?
在进行图像的侵蚀或膨胀之前,需要使用 cv2.getStructuringElement 方法,执行后会返回指定大小和形状的结构元素,接着就会参考这些结构元素进行侵蚀或膨胀,使用方法如下:
kernel = cv2.getStructuringElement(shape, ksize)
# 返回指定大小形狀的結構元素
# shape 的內容:cv2.MORPH_RECT ( 矩形 )、cv2.MORPH_CROSS ( 十字交叉 )、cv2.MORPH_ELLIPSE ( 橢圓形 )
# ksize 的格式:(x, y)
img = cv2.erode(img, kernel) # 侵蝕
img = cv2.dilate(img, kernel) # 擴張
透过侵蚀与膨胀,去除图像中的噪声
下方的程序码执行后,会先将图片进行侵蚀,侵蚀后,比较小的白色圆点就会因为侵蚀而消失,接着再进行膨胀,就可以将主体结构恢复原本的大小,实现去除噪声的效果 ( 恢复原本大小后,边缘会因为计算的缘故不如原本的锐利 ),这种做法常搭配边缘侦测、黑白二值化等方法,应用在文字辨识或图像辨识的领域。
import cv2
img = cv2.imread('test.jpg')
cv2.imshow('oxxostudio1', img) # 原始影像
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (11, 11))
img = cv2.erode(img, kernel) # 先侵蝕,將白色小圓點移除
cv2.imshow('oxxostudio2', img) # 侵蝕後的影像
img = cv2.dilate(img, kernel) # 再膨脹,白色小點消失
cv2.imshow('oxxostudio3', img) # 膨脹後的影像
cv2.waitKey(0) # 按下 q 鍵停止
cv2.destroyAllWindows()
微信扫码关注
抖音扫码关注