扭曲变形太慢了

时间:2018-04-02 19:15:42

标签: python scikit-image affinetransform

(抓住机会不在这里发布一个例子,但我认为这个问题很普遍,没有必要。)

我使用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)

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

谢谢!

1 个答案:

答案 0 :(得分: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秒的时间内完成。在我的电脑上