0

我正在迭代一个 3 维数组(这是一个每个像素有 3 个值的图像),以将 3x3 过滤器应用于每个像素,如下所示:

//For each value on the image    
for (i=0;i<3*width*height;i++){
    //For each filter value
    for (j=0;j<9;j++){
        if (notOutsideEdgesCondition){
            *(**(outArray)+i)+= *(**(pixelArray)+i-1+(j%3)) * (*(filter+j));
        } 
    }
}

我正在使用指针算术,因为如果我使用数组表示法,我将有 4 个循环,并且我试图尽可能少地循环。我的问题是我notOutsideEdgesCondition已经完全失控了,因为我必须考虑 8 个边境案件。我有以下处理条件

  • 左栏:((i%width)==0) && (j%3==0)
  • 右栏:((i-1)%width ==0) && (i>1) && (j%3==2)
  • 上排:(i<width) && (j<2)
  • 下排: (i>(width*height-width)) && (j>5)

并且仍然必须考虑具有更长表达式的 4 个极端情况。在这一点上,我停下来问自己这是否是最好的方法,因为如果我有一个 5 行长的条件评估,它不仅调试起来真的很痛苦,而且会减慢内部循环。这就是为什么我来问你是否有已知的算法来处理这种情况,或者是否有更好的方法来解决我的问题。非常感谢。

4

2 回答 2

0

是的,有一个更好的方法。编写一个快速循环来处理保证没有边界问题的情况。这将包括从倒数第二列到倒数第二行和倒数第二行的区域。然后,您可以编写四个例程来处理每一边(第 0 行、第 0 列、第 N 行和第 N 列),并且您可以手动编码最后四个点。

也就是说,还有很多更快的方法来进行您正在做的寻址计算。

于 2010-05-31T06:50:06.367 回答
-1

一个不错的提示是在数组的顶部添加一个额外的行,并在末尾添加另一个(对列执行相同的操作)。

这些附加的行/列不包含任何信息,但它们会简化计算(无边界情况)。以消耗更多内存为代价...

只是一个想法:)

于 2010-05-31T06:49:11.830 回答