2011-09-30 16 views
7

Nos gustaría corregir la curvatura de campo introducida por una lente en una cámara digital. Planeamos usar un digital unsharp mask En lugar de aplicar un desenfoque gaussiano, nos gustaría probar un desenfoque radial, por lo que el afilado tiene más impacto hacia los bordes de la imagen.Implementar desenfoque radial con OpenCV

¿Cuál es la forma más sencilla de crear una imagen borrosa radial usando OpenCV?

+0

Estaba a punto de publicar la misma pregunta. +1 –

Respuesta

0

Me interesa algo similar al desenfoque de movimiento radial de Photoshop. Si esto también es lo que está buscando, creo que la mejor solución podría ser un iterativo resize y blend (addWeighted). También se puede lograr con remap. Pseudocódigo, más o menos:

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 respuesta anterior está cerca, pero faltan algunos elementos clave que me tomaron un poco darme cuenta. He cambiado los mapas para que calculen correctamente el zoom y se encojan y los sumen/sustraigan de la xey de cada posición (de lo contrario, terminarán reasignando su imagen a un cuadrado pequeño. También cambié el/desenfoque para * desenfocar de lo contrario sus mapas contendrán números muy grandes y simplemente no saldrán bien (múltiplos extremadamente grandes de cada posición).

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 
}