我必须在具有3x3x3邻域的Octave中找到最大值。这意味着我有四层相互叠加,在这些层之间我必须找到一个最大值。这里是一张图片。这不是我正在做的事情,但它代表了我的问题。
Octave layer image http://docs.opencv.org/trunk/_images/sift_dog.jpg
现在为了最大的压抑,我发现了这篇论文:Efficient Non-Maximum Suppression。以下是解释图像中最大值的快速方法。这只是2D情况,但在3D空间中移动它不应该是一个问题。我现在的问题是伪代码理解。我有伪代码:
问题是红色标记部分。我有循环,但我不知道如何应用" - [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;
}
所以它有多么令人惊讶。有人知道我必须在红色标记部分做什么。
答案 0 :(得分: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)]
现在你应该只迭代结果对。