【问题标题】:Warp with skimage too slow用 skimage 变形太慢
【发布时间】:2018-04-02 19:15:41
【问题描述】:

(有机会在这里不发布示例,但我认为这个问题足够笼统,没有必要。)

我正在使用skimage.transform.warp 扭曲一个 200x2000 的图像,给定使用skimage.transform.PiecewiseAffineTransform 计算的 500 个源和目标控制点。当我在单个图像上运行它时,大约需要 3 秒。根据每个人的经验,这是否是该计算的合理运行时间?

我问的原因是我可能有数百个相同尺寸的图像,我想对其应用相同的逆变换,但这会花费很长时间。如果我使用 Python 的 multiprocessing 模块,计算会挂起并且永远不会完成。

我想做的是在单个图像上运行warp,然后在给定输入图像中所有 400000 个像素的值的情况下计算一个多项式,该多项式定义扭曲图像中每个像素的值。数学上:

f'(x,y) = a0_0*f(0,0) + a0_1*f(0,1) + ... + a200_1999*f(200,1999) + a200_2000*f(200,2000)

有没有人建议我如何去做这个或类似的事情或更快地实施一些事情?

谢谢!

【问题讨论】:

  • 也许warp_coords 是您要找的?
  • 考虑尝试使用 OpenCV 来完成这项任务
  • @MarkRansom Warp 完全按照我的意愿工作,只是速度很慢。
  • @soupault 我该如何使用 OpenCV?
  • 重点是warp_coords 创造了可以反复重复使用的东西。

标签: python scikit-image affinetransform


【解决方案1】:

当我不得不校正来自光谱相机的一些图像时,我遇到了类似的问题。我最终使用了sp.ndimage.map_coordinates。您必须构建一个将源点坐标转换为目标坐标的函数(以下示例中的dummy 函数)。我从问题中了解到,对于一堆图像,这种转换是相同的,并且您已经拥有此功能。

然后您生成一个完整的坐标网格,map_coordinates 将通过样条插值将您的原始图像映射到这些新坐标上。

from scipy.ndimage import map_coordinates

# stack of 10 images
imgs=np.random.normal(size=[10,200,2000])
x, y = np.arange(imgs.shape[1]), np.arange(imgs.shape[2])
ini_coord=np.meshgrid(x, y)

# dummy function transforms source points into destination points
def dummy(ini_coord):
    return [0.9*x.T for x in ini_coord]
out_coord=dummy(ini_coord)

import time
tt=time.clock()
out_img=np.zeros(imgs.shape)
for i, img in enumerate(imgs):   
    out_img[i]=map_coordinates(img, out_coord, mode='nearest')

print('{:3f} s'.format(time.clock()-tt))

这运行时间不到 1 秒。在我的电脑上

【讨论】:

  • 我在使用由skimage 估计的多项式变换时遇到了麻烦。我运行tform = transform.estimate_transform('polynomial', dst, src, order=2)。你认为我可以像你上面那样申请tform吗?谢谢
  • @Simone 我想是的,你必须用你的tform 替换dummy,其余的应该是一样的
  • 谢谢。我实际上找不到tform中的转换函数,我会再努力一点。
  • 我猜不是。如果我将其替换为dummy,它将不起作用。我猜这是一堂课。
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 2012-07-07
相关资源
最近更新 更多