edge matrice / condizioni frontiera multidimensionali
-
05-10-2019 - |
Domanda
sto iterazione di un array bidimensionale 3 (che è un'immagine con 3 valori per ogni pixel) per applicare un filtro 3x3 a ciascun pixel come segue:
//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));
}
}
}
Sto usando l'aritmetica dei puntatori, perché se ho usato gamma notazione avrei 4 loop e sto cercando di avere il minor numero possibile di cicli. Il mio problema è il mio notOutsideEdgesCondition
sta diventando abbastanza fuori mano, perché devo prendere in considerazione 8 casi di confine. Ho le seguenti condizioni trattati
- colonna sinistra:
((i%width)==0) && (j%3==0)
- Colonna a destra:
((i-1)%width ==0) && (i>1) && (j%3==2)
- Alta Fila:
(i<width) && (j<2)
- Bassa Fila:
(i>(width*height-width)) && (j>5)
e ancora di prendere in considerazione i 4 casi d'angolo che avranno le espressioni più lunghe. A questo punto ho smesso e ho chiesto io stesso se questo è il modo migliore per andare, perché se ho una linea di 5 valutazione a lungo condizionale che sarà non solo essere veramente doloroso per il debug, ma rallenterà il ciclo interno. È per questo che vengo a voi per chiedere se c'è un algoritmo noto per gestire questi casi o se c'è un approccio migliore per il mio problema. Grazie mille.
Soluzione
Sì, c'è un modo molto migliore. Scrivi un ciclo veloce per gestire i casi in cui v'è garantito per essere problemi di confine. Questo consisterà nella regione dalla seconda alle colonne successive a ultimo e il secondo per righe successive per durare. Poi si può scrivere quattro routine per gestire ciascuno dei lati (riga 0, colonna 0, la riga e la colonna N N) e si può consegnare il codice gli ultimi quattro punti.
Detto questo, ci sono anche un diavolo di un molto più veloce modi di fare i calcoli di indirizzamento che stai facendo.
Altri suggerimenti
Un bel suggerimento è quello di aggiungere una riga aggiuntiva nella parte superiore della matrice, e un'altra alla fine (fare lo stesso per le colonne).
Queste aggiuntive righe / colonne sarà non contenere alcuna informazione ma faciliterà il calcolo (casi di confine). Al prezzo di consumare più memoria ...
Solo un'idea:)