我們想要校正數碼相機中由鏡頭引入的場曲。我們計劃使用digital unsharp mask而不是應用高斯模糊,我們想嘗試徑向模糊,所以銳化對圖像邊緣有更多影響。用OpenCV實現徑向模糊
什麼是使用OpenCV創建徑向模糊的最簡單方法?
我們想要校正數碼相機中由鏡頭引入的場曲。我們計劃使用digital unsharp mask而不是應用高斯模糊,我們想嘗試徑向模糊,所以銳化對圖像邊緣有更多影響。用OpenCV實現徑向模糊
什麼是使用OpenCV創建徑向模糊的最簡單方法?
我感興趣的東西類似於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
}
上面的答案很接近但缺少一些關鍵因素,我花了一些時間弄清楚。 我已經改變了地圖,以便他們正確地計算縮放和縮小,並在每個位置從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
}
我正要發佈相同的問題。 –