我正在迭代一个三维数组(这是一个每个像素有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行长的条件评估,它不仅会让调试变得非常痛苦,而且会减慢内循环。这就是为什么我来找你问是否有一个已知的算法来处理这种情况,或者是否有更好的方法解决我的问题。非常感谢。
答案 0 :(得分:1)
是的,有更好的方法。编写一个快速循环来处理保证没有边界问题的情况。这将包括从第二列到倒数第二列的区域以及从倒数第二列到倒数第二列的区域。然后你可以编写四个例程来处理每一个边(第0行,第0列,第N行和第N列),你可以手工编写最后四个点。
也就是说,你正在进行的寻址计算有很多更快的方法。
答案 1 :(得分:0)
一个不错的提示是在数组的顶部添加一个额外的行,在结尾处添加另一行(对于列执行相同的操作)。
这些附加行/列不包含任何信息,但它们可以简化计算(无边框情况)。以消耗更多内存为代价......
只是一个想法:)