如何顺畅地从另一个图像中删除图像?

时间:2017-03-29 10:56:09

标签: image opencv

在opencv2中,经过一些处理后,我有两个二进制Mat (白色是前景)。第一个Mat是第二个Mat的子图。也就是说:

    Mat mat_small = ....
    Mat mat_big = .....
    Mat result = someProcess(mat_small, mat_big)

我可以做结果= mat_big - mat_small。但mat_big的一些轮廓仍然存在。它看起来像一个又长又薄的外壳。我想删除shell。

我试过cv :: dilate和cv :: erode。在大多数情况下,它工作正常,但有时,长而薄的外壳不会被清除。

而且,有没有办法检测宽度很薄的东西?如果我能做到这一点,我也可以解决我的问题。但我不知道如何做到这一点。

自我回答

更新

从右到左,图像是Mat_big,Mat_small,Mat_minus(Mat_minus = Mat_big - Mat_small),Mat_result:

enter image description here

从右到左,图像是Mat_big,Mat_small,Mat_minus(Mat_minus = Mat_big - Mat_small),Mat_result。

在mat_minus中,我得到了一些我要删除的细长轮廓。

我使用cv :: erode和cv :: dilate在第四张图片中得到了结果。在大多数情况下,它工作正常,但当长而薄的轮廓变得更强一点时,我无法清楚地去除轮廓。

这样(轮廓变得更强一点):

enter image description here

在cv :: erode之后,右边的轮廓很长很薄。当然我可以做cv :: erode很多次去除长而薄的轮廓。但这不是合理的方法。

你知道从一个平滑地减去另一个图像的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以找到轮廓的boundingRect并根据它们的宽度或高度或纵横比(或全部3)来阈值它们以摆脱细轮廓,即仅考虑那些大于特定宽度/高度的轮廓/纵横比,忽略其余部分。