我正在迭代一个三维数组(每个像素有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-1)%width ==0) && (i>1) && (j%3==2)
((i%width)==0) && (j%3==0)
(i<width) && (j<2)(i>(width*height-width)) && (j>5)还要考虑四个角落的情况,它们的表达式都会比较长。此时,我停下来问自己,这是否是最好的方法,因为如果我有一个5行长的条件计算,那么调试不仅会非常痛苦,而且会减缓内环的速度。这就是为什么我来问你,是否有一个已知的算法来处理这个问题,或者是否有一个更好的方法来解决我的问题。非常感谢。
发布于 2010-05-31 06:50:06
是的,有个更好的方法。编写一个快速循环来处理没有边界问题的情况。这将包括从第二列到下一列和从第二列到下一列的区域。然后,您可以编写四个例程来处理每个边(第0行、第0列、第N行和第N列),并且可以手动编写最后四个点的代码。
也就是说,还有很多更快的方法来完成你正在做的寻址计算。
发布于 2010-05-31 06:49:11
一个很好的提示是在数组的顶部添加一个额外的行,在最后再添加一个行(对列做同样的操作)。
这些附加项行/列将不包含任何信息,但它们将简化计算(没有边框)。以消耗更多记忆为代价..。
只是一个想法:)
https://stackoverflow.com/questions/2941794
复制相似问题