扩张梯度w /不同的ROI(blob优化)OPENCV

时间:2013-03-08 22:52:18

标签: c++ opencv blob gradient roi

我正在使用opencv处理c ++中的扩张问题。我已经拍摄了停车场的视频框架,为了获得最好的斑点,我想出了这个。

  1. 侵蚀(5x5内核矩形),3次迭代
  2. 膨胀梯度(将其视为沿y轴的颜色梯度)
  3. 那么我做了什么让这个工作?首先,我需要知道这些点上的2个点(x,y)和2个良好的扩张核粒度。利用该信息,可以在整个图像上对这些值进行插值和外推。所以我根据这些参数计算了ROI(大小和扩张内核大小)。因此,每个ROI都有自己的预定义内核大小,用于扩展。请注意,两个连续的ROI(opencv矩形)之间没有任何空格。一切都很好,但有两个副作用

    1. 斑点两侧的冒泡。黑线是投资回报率的边界! buldges picture
    2. 从主要斑点“切断”的斑点。这些实际上并没有被切断,但是上面的膨胀之一(我认为从上面的投资回报率获得像素信息)的ROI变成了分离的blob。它应该是一个巨大的blob。 blob who shoudn't be there picture
    3. 我已经尝试过改变ROI大小的所有内容并在它们之间留下一些空间,但缺点是2个独立的ROI之间的blob没有扩大。

      所以我的问题是:

      1. 究竟是什么原因引起这些副作用?
      2. 我需要做些什么才能让它们消失?
      3. 修改

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

1 个答案:

答案 0 :(得分:0)

这不能回答你的第一个问题(肯定会导致这些副作用的原因),但为了使它们消失,你可以做一些以下的变体,假设ROI参数是离散的而不是连续的(如图所示)是这样的。)

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

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

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

希望这有帮助!