2011-09-30 14 views
7

Vogliamo correggere la curvatura del campo introdotta da un obiettivo in una fotocamera digitale. Prevediamo di utilizzare un digital unsharp mask Invece di applicare una sfocatura gaussiana, vorremmo provare una sfocatura radiale, quindi la nitidezza ha un impatto maggiore sui bordi dell'immagine.Implementare la sfocatura radiale con OpenCV

Qual è il modo più semplice per creare una sfocatura radiale utilizzando OpenCV?

+0

stavo per pubblicare la stessa domanda. –

risposta

0

Sono interessato a qualcosa di simile al motion blur radiale di Photoshop. Se questo è anche quello che stai cercando, penso che la soluzione migliore potrebbe essere un iterativo resize e blend (addWeighted). Può essere eseguito anche con remap. Pseudocodice, più o meno:

float center_x = width/2; //or whatever 
float center_y = height/2; 
float blur = 0.02; //blur radius per pixels from center. 2px blur at 100px from center 
int iterations = 5; 

Mat mapx, mapy; 
for(int x = 0; x < width; x++) { 
    for(int y = 0; y < height; y++) { 
     mapx[x,y] = (x - center_x)/blur; 
     mapy[x,y] = (y - center_y)/blur; 
    } 
} 

Mat tmp1, tmp2; 
for(int i = 0; i < iterations; i++) { 
    remap(src, tmp1, mapx, mapy, CV_INTER_LINEAR); // enlarge 
    remap(src, tmp2, -mapx, -mapy, CV_INTER_LINEAR); // shrink 
    addWeighted(tmp1, 0.5, tmp2, 0.5, 0, src); // blend back to src 
} 
6

La risposta di cui sopra è vicino, ma mancano alcuni elementi chiave che mi ha portato un po 'per capire. Ho modificato le mappe in modo che calcolino correttamente lo zoom e si restringano e le aggiungono/sottraggono da x e y in ogni posizione (altrimenti finirai per rimappare l'immagine in un quadratino. sfocatura a * sfocatura altrimenti le tue mappe conterranno numeri molto grandi e semplicemente non usciranno a destra (multipli molto grandi di ogni posizione)

float center_x = width/2; //or whatever 
float center_y = height/2; 
float blur = 0.002; //blur radius per pixels from center. 2px blur at 1000px from center 
int iterations = 5; 

Mat growMapx, growMapy; 
Mat shrinkMapx, shrinkMapy; 
for(int x = 0; x < width; x++) { 
    for(int y = 0; y < height; y++) { 
    growMapx[x,y] = x+((x - center_x)*blur); 
    growMapy[x,y] = y+((y - center_y)*blur); 
    shrinkMapx[x,y] = x-((x - center_x)*blur); 
    shrinkMapy[x,y] = y-((y - center_y)*blur); 
    } 
} 

Mat tmp1, tmp2; 
for(int i = 0; i < iterations; i++) { 
    remap(src, tmp1, growMapx, growMapy, CV_INTER_LINEAR); // enlarge 
    remap(src, tmp2, shrinkMapx, shrinkMapy, CV_INTER_LINEAR); // shrink 
    addWeighted(tmp1, 0.5, tmp2, 0.5, 0, src); // blend back to src 
}