【问题标题】:Pseudo-Code non-maximum suppression伪代码非最大抑制
【发布时间】:2014-07-22 11:06:18
【问题描述】:

我必须在 3x3x3 邻域的 Octave 中找到最大值。这意味着我有四层相互叠加,在这些层之间我必须找到一个最大值。为了说明这里的图像。那不是我正在做的事情,但它代表了我的问题。

Octave layer image http://docs.opencv.org/trunk/_images/sift_dog.jpg

现在我发现这篇论文的最大抑制是:Efficient Non-Maximum Suppression。这是解释在图像中找到最大值的快速方法。这只是 2D 情况,但在 3D 空间中移动它应该不是问题。我现在的问题实际上是对伪代码的理解。我有伪代码:

问题是红色标记的部分。我有for循环,但我不知道如何将“-[i,i+n] x [j,j+n]”应用于循环。这就是当下的解决方案:

//find local maxima after paper implementation not finished yet
private  Vector<Integer>  FindLocalMaximum(Image image)
{
     Vector<Integer> list = new Vector<Integer>();
       int n = 1;
       int step = 2*n + 1;

       for(int i = n; i < image.GetWidth()-n; i =step)
           for(int j = n; j < image.GetHeight()-n; j =step)
           {
               int mi = i;
               int mj = j;

               for(int i2 = i; i2 < i + n; i2++  )
                   for(int j2 = j; j2 < j + n; j2++  )
                       if(image.GetPixel(i2, j2) > image.GetPixel(mi, mj))
                       {
                           mi = i2;
                           mj = j2;
                       }
               boolean found = true;
               failed:
               for(int i2 = mi - n; i2 < mi + n; i2++  )
                   for(int j2 = mj - n; j2 < mj + n; j2++  )
                       if(image.GetPixel(i2, j2) > image.GetPixel(mi, mj))
                       {
                           found = false;
                           break failed;
                       }

              if(found)
              {
                  int pos = mj * image.GetWidth() + mi;
                  list.add(pos);
              }
           }

   return list;
}

所以它不起作用是多么令人惊讶。有人知道我必须在红色标记的部分做什么。

【问题讨论】:

    标签: java algorithm image-processing pseudocode


    【解决方案1】:

    我会用伪代码给你一个例子:

    listA = [1, 2, 3]
    listB = [a, b, c]
    
    listA x listB = [(1, a), (1, b), (1, c), ...]
    
    # excluded
    listAe = [1, 3]
    listBe = [a, b]
    
    listAe x listBe = [(1, a), (1, b), ...]
    
    # result
    listA x listB - listAe x listBe = [(1, c), (2, a), (2, b), (2, c), (3, c)] 
    

    现在您应该只迭代结果对。

    【讨论】:

    • 好吧,我明天再考虑。我的解决方案看起来有点脑筋急转弯。 xD
    • 看起来我必须从集合论中获得一些程序,大多数集合差异。大多set方法都不是很快,但是找不到更优雅的方法。你曾经使用过它吗?
    • 我通常使用 Scala 来解决这些问题。它与 Java 兼容,在同一个 VM 上运行,效率更高。
    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2013-03-25
    • 2015-05-17
    相关资源
    最近更新 更多