OpenCV-Python图像腐蚀和膨胀

xiaohai 2023-07-11 16:17:49 1873人围观 标签: Opencv 
简介图像的腐蚀与膨胀互为逆向操作,通常用于处理二值图像(黑白图,以黑色为底面背景),因此需要先进行二值化处理,腐蚀和膨胀通俗的理解就是,在指定大小的卷积核内,如果该卷积核内全为黑色或全为白色,则该卷积核内像素值不变,但若是既有黑色又有白色,即在图像边缘处,那么膨胀操作则会将该卷积核内所有白色像素点都赋值变为黑色,以此将图像向内腐蚀掉一圈,而膨胀操作则相反,会将卷积核内的黑色像素点赋值成2白色,以此让图像膨胀一圈。
一、图像的腐蚀

它会侵蚀前景物体的边界,并从图像中移除小规模的细节,但同时会减少感兴趣区域的大小。在该操作中,对图像中任意形状的奇数大小的卷积核进行卷积,如果核下的所有像素都为1,则认为原始图像中的像素(1或0)为1,否则将其侵蚀,即使其为零。因此,根据内核的大小,所有靠近边界的像素都将被丢弃。因此前景物体的厚度或大小减小或者图像中的白色区域减小。该方法适用于去除小的白噪声和分离两个连通的物体。基本上,它计算给定核区域上的局部最小值。前景物体的厚度或大小会减少换句话说,图像中的白色区域会减少。

import cv2
import numpy as np

src_img = cv2.imread("2-1.jpg", cv2.IMREAD_UNCHANGED)

cv2.imshow("src_img", src_img)

#定义要处理的卷积核大小和卷积核的类型,这里定义了两种,比较效果
k1 = np.ones((3, 3), np.uint8)
k2 = np.ones((5, 5), np.uint8)

res_img_1 = cv2.erode(src_img, k1)
res_img_2 = cv2.erode(src_img, k2)

cv2.imshow("res_img_1", res_img_1)
cv2.imshow("res_img_2", res_img_2)

cv2.waitKey(0)
cv2.destroyAllWindows()

图片alt

二、图像的膨胀

膨胀操作通常使用一种构造元素来探测和扩展输入图像中包含的形状。这种作用与侵蚀相反。在此操作中,对图像中任意形状的奇数大小的卷积核进行卷积,如果核下至少有一个像素为1,则该像素元素为1。所以它增加了图像中的白色区域或者前景物体的大小增加了。为了去除噪声,侵蚀之后是膨胀。因为,侵蚀会去除白噪声,但也会缩小我们的物体。所以我们把它扩张。因为噪音消失了,它们不会再回来,但我们的目标面积增加了。它在连接对象的破碎部分时也很有用。

import cv2
import numpy as np

src_img = cv2.imread("2-1.jpg", cv2.IMREAD_UNCHANGED)

cv2.imshow("src_img", src_img)

k1 = np.ones((3, 3), np.uint8)
k2 = np.ones((5, 5), np.uint8)

res_img_1 = cv2.dilate(src_img, k1)
res_img_2 = cv2.dilate(src_img, k2)

cv2.imshow("res_img_1", res_img_1)
cv2.imshow("res_img_2", res_img_2)

cv2.waitKey(0)
cv2.destroyAllWindows()

图片alt

腐蚀操作一般用于消去图像中不需要的粘连部分,而膨胀操作则用于填充图像内的空白部分,同时也可以恢复图像由于进行腐蚀操作后缩小的面积。