2011-09-30 73 views
7

我們想要校正數碼相機中由鏡頭引入的場曲。我們計劃使用digital unsharp mask而不是應用高斯模糊,我們想嘗試徑向模糊,所以銳化對圖像邊緣有更多影響。用OpenCV實現徑向模糊

什麼是使用OpenCV創建徑向模糊的最簡單方法?

+0

我正要發佈相同的問題。 –

回答

0

我感興趣的東西類似於Photoshop徑向運動模糊。如果這也是你正在尋找的,我認爲最好的解決方案可能是迭代resize和混合(addWeighted)。也可以用remap完成。僞代碼,或多或少:

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

上面的答案很接近但缺少一些關鍵因素,我花了一些時間弄清楚。 我已經改變了地圖,以便他們正確地計算縮放和縮小,並在每個位置從x和y加上/減去它們(否則,您將最終將圖像重新映射到一個小方塊。模糊*模糊,否則您的地圖將包含非常大的數字,只是不出來的權利(每個位置的極大倍數)。

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 
}