opencv 从图像中删除形状

erhoui1w  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(151)

我正在拍摄这样的照片:

我的最终目标是检测新图片上的茎干末端是否在圆圈中(圆圈的位置和大小可能会有一点变化),我想只使用图像处理进行尝试(第一次尝试时没有ML,因为似乎没有必要),但我对此没有了解。
问题是,在数据集的一部分,不存在清晰的梯形,而在另一部分,它是存在的。没有梯形的问题似乎相当简单(查找茎的末端是否在圆圈中),所以**我想找到一种方法来“擦除”图片中的吊架,因为我需要我的算法来处理这两个图像(有和没有梯形)。我能够知道梯形是否与图片的名称一起出现。
首先,我对图像进行降噪处理,通过查看像素的强度,你可以看到下面(强度在纵坐标,计数在横坐标),我只是把像素值合并成5组。

但是正如你所看到的,茎的一部分比茎的其他部分更接近梯形的强度。此外,边缘的值也是有问题的。
如果它能提供更多的信息,我还尝试了边缘检测,并实现检测圆无论他的位置和大小。这里是一个边缘检测结果的潜峰:

我对任何想法都持开放态度(我知道最初的问题是如何消除空中飞人,但如果你认为这是没有必要和缺乏时间,我会考虑每一个选项):)

iqxoj9l9

iqxoj9l91#

既然你说这个问题看起来很容易,没有更轻的形状,我将假设你知道如何检测圆和直线/线段(例如,使用霍夫变换的变体,正如评论中所建议的)。
在边缘图像中,你可以清楚地看到圆圈,你应该可以找到它(如果我理解正确的话,你已经找到了)。
您应该能够找到多个行。剩下的问题是找出哪一行是您感兴趣的行。您可以通过多种方法找到这一行,例如:

  • 请注意,强度在词干的两侧是相似的,但在您想要忽略的一条线的两侧却有很大的不同。使用此函数可以找到差异最小的那条线。
  • 梯形的边相交。检查所有线段的组合,去掉那些形成角的线段。你也可以将Angular 限制在某个预期的范围内。
  • 在你的图像中,词干由两条基本平行的线组成,如果总是这样(而且这两条线总是可以区分的),你可以用它来判断哪条线是你要找的。
  • 检查是否有一条线段在圆内终止,但不与另一条线段接触。如果找到一条线段,则表明其尖端在圆内。

量化这些条件,并检查其中一个或组合是否允许您可靠地从所有行中挑选出词干。
最有问题的情况当然是 Backbone.js 和边缘对齐。其他特殊但问题较少的情况是 Backbone.js 穿过一个或多个边缘,或者 Backbone.js 在边缘结束。我不清楚哪种情况会发生-如果可能,请确保您考虑并测试这些情况。

相关问题