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)
avere

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.

È stato utile?

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:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top