Ответ выше близок, но пропущено несколько ключевых элементов, которые мне понадобились, чтобы разобраться.
Я изменил карты так, чтобы они правильно вычисляли масштаб и сжатие, и добавил / вычел их из 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
}