Я перебираю трехмерный массив (который представляет собой изображение с 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 строк, отладка будет не только по-настоящему болезненной, но и замедлит внутренний цикл. Вот почему я пришел к вам, чтобы спросить, есть ли известный алгоритм для обработки этих случаев или есть лучший подход к моей проблеме. Большое спасибо.