【图像处理】腐蚀(erode)和膨胀(dilate)
原理
二值图像的处理方法,虽然基础,但在消除孔洞等任务中的效果非常好
腐蚀(erode)
腐蚀操作会把高亮(即值为255)的边界腐蚀掉。设定卷积核尺寸,卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为0。
膨胀(dilate)
膨胀操作会把高亮(即值为255)的边界膨胀开。设定卷积核尺寸,卷积核沿着图像滑动,与卷积核对应的原图像的像素值中只要有一个是1,中心元素的像素值就是1。
OpenCV实现
某些场景下,先用腐蚀再用膨胀可以达到去除噪声的效果
C++实现
腐蚀:
Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
erode(src, dst, element)
膨胀:
Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
dilate(src, dst, element)
- getStructuringElement:返回指定形状和尺寸的结构元素
- src:输入图像
- dst:腐蚀或膨胀操作后输出图像
- element:自定义卷积核
关于函数getStructuringElement:
- 第一个参数:矩形——MORPH_RECT,交叉形——MORPH_CROSS,椭圆形——MORPH_ELLIPSE
- 第二个参数:卷积核的尺寸
- 第三个参数:锚点的位置,默认值Point(-1, -1),表示锚点位于中心点
python实现
腐蚀:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.erode(src, kernel)
膨胀:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.dilate(src, kernel)
开运算(Opening Operation)
先腐蚀后膨胀
开运算可以用来消除小物体,在纤细点出分离物体,平滑较大物体的边界同时并不明显改变其面积
闭运算(Closing Operation)
先膨胀后腐蚀
闭运算能够消除小型黑洞
形态学梯度(Morphological Gradient)
膨胀图与腐蚀图之差
对二值图像进行这一操作可以将团块(blob)的边缘突出来,可以用来保留物体的边缘轮廓
顶帽运算(Top Hat)
原图像与开运算的结果图之差
黑帽运算(Black Hat)
闭运算的结果图与原图像之差
结语
如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
如果我的文章对您有帮助,转载请注明出处。