在 OpenCV 中放大对象轮廓

Posted

技术标签:

【中文标题】在 OpenCV 中放大对象轮廓【英文标题】:Enlarging objects contours in OpenCV 【发布时间】:2018-11-11 19:41:32 【问题描述】:

从我的图像中,我创建了一个标记一些对象的二进制掩码(一张图像上最多三到四个对象)。 假设我的面具上那些标记的对象的总表面场为X

现在我想放大它们的轮廓,以便剩余的空间(黑色区域)的表面积为X。 如果他们占用的图像超过50%,那么我想保持不变。

【问题讨论】:

您熟悉侵蚀/扩张的概念吗?这是你需要的吗? 是的,我很熟悉。我在考虑扩张,但我无法明确指定可以通过扩张将对象放大到哪个大小,对吗?膨胀会使我的对象更大,问题是我对我希望它们有多大有严格的规定。 是的,你是对的。您可以调整卷积滤波器的大小,但您无法提前知道对象的表面。知道这一点的唯一方法是应用扩张和计算表面......所以你可以在一个循环中这样做,直到你达到令人满意的精度。我想不出更好的解决方案,我觉得这不是您需要的,所以我不会将其发布为答案... 【参考方案1】:

我会做以下事情。计算掩码的距离变换 M。然后取一些合理的距离 d > 0 作为起始值。然后进行二分查找,即如果 M

【讨论】:

我打算提出类似的建议,但我会计算距离变换的累积直方图,然后您可以轻松找到背景占所有像素一定百分比的阈值。 通过执行距离变换,我可以评估蒙版的大小(非零像素)。对?然后我可以找到这个阈值,但是接下来呢?如何使用此阈值? user3726947,如果我发现这个“d”变量我不确定我是否理解正确,我该怎么办 我认为 Cris 提出的直方图方法比二分搜索更好,所以我建议你尝试一下。 好的,但你能更具体地解释一下吗,我是 OpenCV 的新手。我应该如何处理这个直方图?我应该使用哪些操作来扩大我的轮廓? @KarolŻurowski:您需要计算背景内的距离变换 (DT)(即到掩码中最近的“on”像素的距离)。这个 DT 的任何阈值,倒置,都与掩模的膨胀相同。阈值越高,膨胀越大。从某种意义上说,DT 包含所有可能的膨胀。这是同时检查许多不同大小的膨胀的好方法。

以上是关于在 OpenCV 中放大对象轮廓的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-Python实战(10)——详解 OpenCV 轮廓检测

android如何在 java opencv 中查找最大轮廓

python-opencv轮廓基本绘制

OpenCV实战(15)——轮廓检测详解

OpenCV跟踪轮廓将整个图像跟踪为最大轮廓?

C++ OpenCV轮廓发现