膨胀和腐蚀是图像处理中最常用也是最基础的形态学操作。它可以改变图像的一些属性。其中比较常见的应用场景有:
1、边缘检测:膨胀和腐蚀可以提取二值图像中的边缘信息。通过先膨胀再腐蚀的操作,可以使边缘更加的明显。所以可以为边缘检测提供很好的辅助作用
2、噪声去除:在二值图像中可能存在一些噪声点,或者孤立的像素点,我们通过一定次数的腐蚀操作就可以将孤立的像素点消除掉,也可以通过一定次数的膨胀操作来填充小的噪声点。
3、图像分割:可以通过膨胀和腐蚀的操作,提取文本区域等等
4、形态学重建:形态学重建也是一种基于膨胀和腐蚀处理图像的方法,可以用于重建二值图像中的形状,比如在医学图像处理中就可以使用到形态学重建来分割肺部区域
5、形态学梯度:形态学梯度就是指的膨胀和腐蚀之间的差异,用于检测图像中的物体边缘,比如在工业质检中可以用来检测产品的缺陷和边缘
膨胀的原理:
膨胀操作是将图像中的物体边缘膨胀或者扩张。他将原始图像中的每个像素替换为它的相邻像素中的最大值。膨胀可以使物体变得更加的粗壮或者消除小的孤立区域。
腐蚀的原理:
腐蚀操作是将图像中的物体边缘腐蚀或者缩小。他将原始图像中的每个像素替换为它的相邻像素中的最小值。腐蚀可以使物体变得更加细小或者消除小的噪声点。
函数介绍:
在opencv中,可以用cv2.erode()函数和cv2.dilate()函数来实现腐蚀和膨胀操作。这两个函数都有相似的参数列表:
cv2.erode(src,kernel[,dst[,anchor[,iterations[,borderType[,borderValue]]]]])
cv2.dilate(src,kernel[,dst[,anchor[,iterations[,borderType[,borderValue]]]]])
其中,src使输入图像,kernel是核元素,用于计算膨胀或腐蚀的结构元素,dst是输出图像,anchor是结构元素的锚点位置,iterations是迭代次数,boderType是用于填充边缘的像素边界类型,borderValue是用于填充边缘的像素值
实例:
我们举个例子:
import cv2 as cv
import numpy as np
def test():
# 读取图像
img = cv.imread("input.jpg", cv.IMREAD_GRAYSCALE)
# 定义结构元素
kernel = np.ones((5, 5), np.uint8)
# 腐蚀操作
erosion = cv.erode(img, kernel, iterations=1)
# 膨胀操作
dilation = cv.dilate(img, kernel, iterations=1)
# 膨胀再腐蚀
re_erosion = cv.erode(dilation, kernel, iterations=1)
cv.imshow("original", img)
cv.imshow("erosion", erosion)
cv.imshow("dilation", dilation)
cv.imshow("re_erosion", re_erosion)
cv.waitKey(0)
cv.destroyAllWindows()
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
test()
原图:
膨胀后的效果(物体变粗):
腐蚀后的效果(物体变细)
先膨胀再腐蚀后的效果(保留了更多的细节,并减少了噪点)