Реализация радиального размытия с помощью OpenCV - PullRequest
7 голосов
/ 30 сентября 2011

Мы хотели бы скорректировать кривизну поля, вносимую объективом в цифровую камеру. Мы планируем использовать цифровую нерезкую маску Вместо применения размытия по Гауссу, мы хотели бы попробовать радиальное размытие, чтобы резкость оказывала большее влияние на края изображения.

Какой самый простой способ создать радиальное размытие с помощью OpenCV?

Ответы [ 2 ]

6 голосов
/ 04 декабря 2012

Ответ выше близок, но пропущено несколько ключевых элементов, которые мне понадобились, чтобы разобраться. Я изменил карты так, чтобы они правильно вычисляли масштаб и сжатие, и добавил / вычел их из x и y в каждой позиции (в противном случае вы просто переставите изображение на крошечный квадрат. Также я изменил / blur * размытие, иначе ваши карты будут содержать очень большие числа и просто не получатся правильными (очень большие кратные каждой позиции).

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
}
0 голосов
/ 05 октября 2011

Меня интересует что-то похожее на Photoshop Radial Motion Blur. Если это также то, что вы ищете, я думаю, что лучшим решением может быть итеративное 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
}
...