【图像处理】腐蚀(erode)和膨胀(dilate)

【图像处理】腐蚀(erode)和膨胀(dilate)

  • 原理
    • 腐蚀(erode)
    • 膨胀(dilate)
  • OpenCV实现
    • C++实现
    • python实现
  • 开运算(Opening Operation)
  • 闭运算(Closing Operation)
  • 形态学梯度(Morphological Gradient)
  • 顶帽运算(Top Hat)
  • 黑帽运算(Black Hat)
  • 结语

原理

二值图像的处理方法,虽然基础,但在消除孔洞等任务中的效果非常好

腐蚀(erode)

腐蚀操作会把高亮(即值为255)的边界腐蚀掉。设定卷积核尺寸,卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为0。
【图像处理】腐蚀(erode)和膨胀(dilate)_第1张图片

膨胀(dilate)

膨胀操作会把高亮(即值为255)的边界膨胀开。设定卷积核尺寸,卷积核沿着图像滑动,与卷积核对应的原图像的像素值中只要有一个是1,中心元素的像素值就是1。
【图像处理】腐蚀(erode)和膨胀(dilate)_第2张图片

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)

闭运算的结果图与原图像之差

结语

如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。

你可能感兴趣的:(图像处理)