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