提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、什么是腐蚀
在我们生活中常会见到腐蚀,比如金属表面受到氧化或其他化学物质的侵蚀,导致金属表面出现腐蚀、或者生锈。
木材受到细菌或者昆虫的侵蚀,导致木材内部和表面逐渐腐朽或者磨损。
在计算机世视觉中腐蚀操作和现实中类似,腐蚀主要用于减小或消除图像中的边缘或细小的物体。在这个操作中,我们使用一个称为结构元素的小矩形或圆形区域来"侵蚀"图像中的像素。具体来说,当结构元素与图像中的像素进行比较时,只有当结构元素覆盖的所有像素都是前景像素(白色像素)时,该像素才被视为前景像素,否则被视为背景像素(黑色像素)。通过这种方式,腐蚀操作可以使前景物体的边界变得更加平滑,并消除小的物体或者连接较弱的边缘。
你可以想象我们有一个雕刻的石像,但是石像有点瑕疵,我们需要用到工具(结构元素或者叫卷积核)来把他给打磨一下,让它看起来更符合我们的要求。这就是我们使用腐蚀的目的。
二、如何实现腐蚀
先上代码:
python
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
image = cv2.imread('./img/yunfeng2.jpg')
# 定义结构元素
kernel = np.ones((5,5),np.uint8)
# 执行腐蚀操作
erode_image = cv2.erode(image, kernel, iterations=1)
# 显示原始图像和腐蚀后的图像
cv2.imshow('original', image)
cv2.imshow('erod', eroded_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
看下结果: 上面是原图,下面是腐蚀后的图
可以看到原图有一些线和点 在腐蚀操作后都消失了,但是我们字好像也变得细了一些。
三、腐蚀的原理
我们看下上面的腐蚀代码
python
kernel = np.ones((5,5),np.uint8)
erode_image = cv2.erode(image, kernel, iterations=1)
kernel是一个卷积核 也就是我们刚开始提到的结构元素,我们设置为他为5x5像素的。
我们开始介绍时提到腐蚀操作的过程是结构元素与图像中的像素进行比较时,只有当结构元素覆盖的所有像素都是前景像素(白色像素)时,该像素才被视为前景像素,否则被视为背景像素(黑色像素)。
你可以想象一下,现在有一个5x5像素的方格,
方格内容可以根据需要自定义,以适应不同的图像处理任务,例如腐蚀、膨胀、开运算、闭运算等形态学操作,我们这里假定方格的内容比如全是1。
方格在图像上滑动,并且方格与重叠的图像区域的每个像素进行逐个比较假设我们方格移动到上方图像的一个杂点上 这个杂点可能包含多个像素,我们方格对这个杂点每个像素都要比较, 方格覆盖其中一个像素 ,方格覆盖的区域有黑色,那当前这个点就会被腐蚀掉。如果方格覆盖范围全是白色,那就不会腐蚀。
如果还是不明白 可以看下图:
我吧上图的一个杂点给放大 如下图
这个白色的就是杂点,红色方格就是我们的5x5像素的方格也就是结构元素,方格以自身中心点的位置为基准进行移动的,中心位置就是上图箭头标示的位置。可以看到,方格中心点在杂点的第一个像素上时,方格区域内有黑色像素,所以,杂点的第一个像素就被腐蚀掉,一次类推 逐渐移动杂点的每一个像素。
继续移动到下图的位置:
我们发现 方格内没有了黑色部分,那与方格中心点重叠的这个像素就不会被腐蚀。有人可能会问,我们刚才演示的云峰那个图片上腐蚀操作后没有白色的杂点了。我们来把刚才腐蚀后的图片方法看一下,
其实以像素方式去看的话 还是有杂点,只不过太小了 我们视觉肯定看不到了。
再回到我们上面提到的问题:为什么字变细了?相信聪明的你已经有答案了。
我们想一下,我们如果不是设置的5x5的方格而是设置更大或者更小的方格,会对结果有影响吗,有了上面的分析我们可以得出以下结论:
方格的大小可以影响着:
1.腐蚀程度: 结构元素的大小决定了腐蚀操作的程度。较大的结构元素通常会产生更强的腐蚀效果,而较小的结构元素则会产生较弱的腐蚀效果。因此,结构元素的大小会直接影响图像中前景物体的大小和形状。
2.细节保留: 较小的结构元素能够更好地保留图像中的细节和小的特征,因为它们只会影响局部区域。相反,较大的结构元素可能会模糊或丢失一些细小的特征。
3.计算复杂度: 较大的结构元素意味着需要在图像的更多位置执行比较操作,这会增加计算的复杂度和运行时间。因此,在选择结构元素大小时需要考虑到计算资源的限制。
上面腐蚀操作还有一个参数
python
erode_image = cv2.erode(image, kernel, iterations=1)
iterations代表迭代次数,也就是腐蚀几次,1代表只腐蚀1次,设置2就是腐蚀2次。还是刚才的图片我们如果腐蚀2次,那我们上面说的 还保留一点的杂点就会被腐蚀掉,但是同样字也会变得更细。实际效果大家可以自行测试。