Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 伪码非最大抑制_Java_Algorithm_Image Processing_Pseudocode - Fatal编程技术网

Java 伪码非最大抑制

Java 伪码非最大抑制,java,algorithm,image-processing,pseudocode,Java,Algorithm,Image Processing,Pseudocode,我必须在一个有3x3个邻域的八度音阶中找到一个最大值。这意味着我有四层在彼此之上,在这四层之间我必须找到一个最大值。为了便于说明,这里有一个图像。这不是我所做的,但它代表了我的问题所在 现在,我发现这篇论文的最大惊喜是:。这里有一个快速的方法来解释如何在图像中找到最大值。这只是2D的情况,但在3D空间中移动它应该不会有问题。我现在的问题实际上是对伪代码的理解。我有伪代码: 问题是红色标记的部分。这里有for循环,但我不知道如何将“-[I,I+n]x[j,j+n]”应用于循环。这就是目前的解决

我必须在一个有3x3个邻域的八度音阶中找到一个最大值。这意味着我有四层在彼此之上,在这四层之间我必须找到一个最大值。为了便于说明,这里有一个图像。这不是我所做的,但它代表了我的问题所在

现在,我发现这篇论文的最大惊喜是:。这里有一个快速的方法来解释如何在图像中找到最大值。这只是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;
}
//在纸面实现尚未完成后查找局部最大值
私有向量FindLocalMaximum(图像)
{
向量列表=新向量();
int n=1;
整数步长=2*n+1;
for(int i=n;iimage.GetPixel(mi,mj))
{
mi=i2;
mj=j2;
}
布尔值=真;
失败:
for(inti2=mi-n;i2image.GetPixel(mi,mj))
{
发现=错误;
破裂失败;
}
如果(找到)
{
int pos=mj*image.GetWidth()+mi;
列表。添加(pos);
}
}
退货清单;
}

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

我将给你一个伪代码示例:

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)] 

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

好的,明天我会考虑。看来我的解决方案有点头脑混乱。看起来我必须从集合论中学习一些程序,大多数集合是不同的。大多数set方法都不是很快,但找不到更优雅的方法。你用过吗?我通常用Scala来解决这些问题。它与Java兼容,在同一个VM上运行,而且效率更高。