1

我正在使用 opencv 处理 c++ 中的膨胀问题。我已经捕获了停车场的视频帧,为了获得最好的 blob,我想出了这个。

  1. 侵蚀(5x5 内核矩形),3 次迭代
  2. Dilation GRADIENT(将其视为沿 y 轴的颜色渐变)

那么我做了什么来让它工作呢?首先,我需要知道 2 个点 (x,y) 和在这些点上 2 个良好的扩张核大小。有了这些信息,人们就可以在整个图像上对这些值进行插值和外推。所以我根据这些参数计算了投资回报率(大小和扩张内核大小)。所以每个 ROI 都有自己预定义的 kernelsize 用于扩张。请注意,两个连续的 ROI(opencv 矩形)之间没有任何空格。一切正常,但有两个副作用

  1. 斑点两侧的凸起。黑线是 ROI 的边界! 凸出图片
  2. 从主 blob 中“切断”的 blob。这些实际上并没有被切断,但是上面一个blob下的ROI扩张(我认为从上面的ROI获取像素信息)成分开的blob。它应该是一个巨大的斑点。不应该在那里的 blob 图片

我已经尝试了所有改变 ROI 大小的方法,并在它们之间留下了一些空间,但缺点是 2 个单独的 ROI 之间的斑点没有扩大。

所以我的问题是:

  1. 究竟是什么导致了这些副作用?
  2. 我该怎么做才能让它们消失?

编辑

所以我找到了我的解决方案:当您调用 opencv dilate 函数时,需要确定是否可以将相同的 cv::Mat 用作目标图像。如果不是,您将使用原始图像和新图像的一部分。所以我所要做的就是包括一个目的地 cv::Mat。

4

1 回答 1

0

这并不能回答您的第一个问题(肯定会导致这些副作用的原因),但是要使它们消失,您可以执行以下一些变体,假设 ROI 参数是离散的而不是连续的(似乎是这种情况)。

您可以使用每个可能的内核大小来计算整个图像的膨胀。然后,在计算完所有这些二进制图像之后,您可以将它们组合在一起,从正确的图像中提取正确的样本以获得所需的输出图像。这绝对会浪费大量时间,但它应该在没有工件的情况下工作。

一旦你确认你已经得到了上面的结果(几乎可以保证质量尽可能好),你就可以开始尝试优化了。我要尝试的一件事是扩展每个 ROI 大小,以便按内核大小的大小计算膨胀。这可能会绕过可能由奇怪的边界条件引起的伪影。

这导致我首先猜测导致伪影的原因:每当您拍摄有限图像并运行卷积(或形态算子)时,您都需要选择对边缘像素做什么。通常,访问 (-4, -1) 处的像素是没有意义的,但是如果你的内核与它重叠,你就必须执行操作符。如果 OpenCV 正在为您的子区域进行边缘填充,它很容易为您提供您所看到的工件。

希望这可以帮助!

于 2013-03-08T23:13:45.993 回答