【图像处理】腐蚀(erode)和膨胀(dilate)
原理腐蚀(erode)膨胀(dilate) OpenCV实现C++实现python实现 开运算(Opening Operation)闭运算(Closing Operation)形态学梯度(Morphological Gradient)顶帽运算(Top Hat)黑帽运算(Black Hat)结语原理
二值图像的处理方法,虽然基础,但在消除孔洞等任务中的效果非常好
腐蚀(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)
闭运算的结果图与原图像之差
结语
如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
如果我的文章对您有帮助,转载请注明出处。