在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:
从右到左,图像是Mat_big,Mat_small,Mat_minus(Mat_minus = Mat_big - Mat_small),Mat_result。
在mat_minus中,我得到了一些我要删除的细长轮廓。
我使用cv :: erode和cv :: dilate在第四张图片中得到了结果。在大多数情况下,它工作正常,但当长而薄的轮廓变得更强一点时,我无法清楚地去除轮廓。
这样(轮廓变得更强一点):
在cv :: erode之后,右边的轮廓很长很薄。当然我可以做cv :: erode很多次去除长而薄的轮廓。但这不是合理的方法。
你知道从一个平滑地减去另一个图像的方法吗?
答案 0 :(得分:0)
您可以找到轮廓的boundingRect并根据它们的宽度或高度或纵横比(或全部3)来阈值它们以摆脱细轮廓,即仅考虑那些大于特定宽度/高度的轮廓/纵横比,忽略其余部分。