具有不同投资回报率的扩张梯度(斑点优化)OPENCV

Dilation Gradient w/ different ROI's (blob optimization) OPENCV

本文关键字:张梯度 斑点 优化 OPENCV 投资 回报率      更新时间:2023-10-16

我正在用opencv解决c++中的扩展问题。我捕捉了一个停车场的视频帧,为了获得最好的斑点,我想出了这个。

    侵蚀(5x5核矩形),3次迭代
  1. 膨胀梯度(把它想象成沿着y轴的颜色梯度)

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

  1. 在斑点的侧面建立。黑线是ROI的边界!buldges图片
  2. 从主blob中"切断"的blob。这些实际上并没有被切断,但上面一个blob下的ROI扩展(从上面的ROI中获取像素信息,我认为)成分离的blob。它应该是一个大团。图片

我已经尝试了改变ROI大小的一切,并在它们之间留下了一些空间,但缺点是2个分离的ROI之间的blob没有扩大。

我的问题是:

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

编辑

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

这并不能回答你的第一个问题(当然是什么导致了这些副作用),但是为了让它们消失,你可以做以下的一些变体,假设ROI参数是离散的,而不是连续的(似乎是这样)。

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

一旦你确认了你上面得到的结果(这几乎可以保证是尽可能好的质量),你可以开始尝试优化。我尝试的一件事是扩展每个ROI大小,以计算内核大小的扩展。这可能会绕过由奇怪的边界条件产生的工件。

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

希望这对你有帮助!