首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用OpenCV实现径向模糊

用OpenCV实现径向模糊
EN

Stack Overflow用户
提问于 2011-09-30 15:50:18
回答 3查看 4.2K关注 0票数 8

我们想要校正数码相机中镜头引入的场曲率。我们计划使用digital unsharp mask而不是高斯模糊,我们想尝试径向模糊,这样锐化对图像的边缘有更大的影响。

使用OpenCV创建径向模糊最简单的方法是什么?

EN

回答 3

Stack Overflow用户

发布于 2012-12-04 17:37:15

上面的答案很接近,但遗漏了一些我花了一点时间才弄明白的关键元素。我已经更改了地图,以便它们可以正确地计算缩放和收缩,并从每个位置的x和y中添加/减去它们(否则,您将最终将图像重新映射到一个小正方形。另外,我把/blur改成了*模糊,否则你的地图就会包含非常大的数字,结果就不对了(每个位置的倍数都非常大)。

代码语言:javascript
复制
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
}
票数 6
EN

Stack Overflow用户

发布于 2019-09-18 22:59:29

Python代码:

代码语言:javascript
复制
w, h = img.shape[:2]

center_x = w / 2
center_y = h / 2
blur = 0.01
iterations = 5

growMapx = np.tile(np.arange(h) + ((np.arange(h) - center_x)*blur), (w, 1)).astype(np.float32)
shrinkMapx = np.tile(np.arange(h) - ((np.arange(h) - center_x)*blur), (w, 1)).astype(np.float32)
growMapy = np.tile(np.arange(w) + ((np.arange(w) - center_y)*blur), (h, 1)).transpose().astype(np.float32)
shrinkMapy = np.tile(np.arange(w) - ((np.arange(w) - center_y)*blur), (h, 1)).transpose().astype(np.float32)

for i in range(iterations):
    tmp1 = cv2.remap(img, growMapx, growMapy, cv2.INTER_LINEAR)
    tmp2 = cv2.remap(img, shrinkMapx, shrinkMapy, cv2.INTER_LINEAR)
    img = cv2.addWeighted(tmp1, 0.5, tmp2, 0.5, 0)
票数 3
EN

Stack Overflow用户

发布于 2011-10-05 07:25:34

我对类似Photoshop径向运动模糊的东西很感兴趣。如果这也是您正在寻找的,我认为最好的解决方案可能是迭代式的resize和blend (addWeighted)。也可以使用remap来完成。伪代码,或多或少

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7607464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档