Ho un'immagine di binaria, il binario valore di è 0 o 255. il tipo di dati di immagine è unsigned char. Qui ho bisogno di fare un filtraggio mediano su questa immagine.Eliminare ramificazione quando ritrovamento mediano in un binario {0, 255} immagine
Penso che usando un istogramma per trovare la mediana dovrebbe essere veloce. Utilizzando alcuni codici per spiegare:
unsigned int hist[2] = {0, 0};
for (int i = 0; i < kernel_h; ++i) {
for (int j = 0; j < kernel_w; ++j) {
if (image(i,j) == 0) {
hist[0]++;
}
else {
hist[1]++;
}
}
}
Quindi, è possibile ottenere il valore medio molto velocemente. Ma a causa di questo caso, i codici ancora potrebbe essere migliorato:
int counter = 0;
for (int i = 0; i < kernel_h; ++i) {
for (int j = 0; j < kernel_w; ++j) {
if (image(i,j) == 0) {
counter++
}
else {
counter--;
}
}
}
Ma mi chiedo c'è qualche altro modo per eliminare il ramo if-else, come l'utilizzo di operazioni su bit per mappare {0, 255} a qualcosa di così che potremmo semplicemente aggiornare una bandiera senza diramazioni.
Qualcuno suggerimento?
La vettorizzazione è un'opzione per te? E su quale piattaforma sei? I filtri mediani 3x3 e 5x5 su immagini binarie sono banalmente vettorizzabili su entrambi i processori x86 e ARM, utilizzando estensioni SSE, NEON o DSP. Su dati in formato byte, dovresti essere in grado di elaborare 16 pixel contemporaneamente con SSE. –