用 skimage 变形太慢
Warp with skimage too slow
(趁机不在这里发布示例,但我认为这个问题很笼统,没有必要。)
我正在使用 skimage.transform.warp
扭曲 200x2000 的图像,给定使用 skimage.transform.PiecewiseAffineTransform
计算的 500 个源和目标控制点。当我 运行 在单个图像上执行此操作时,大约需要 3 秒。根据每个人的经验,这是一个合理的运行计算时间吗?
我问的原因是我可能有数百张相同尺寸的图像,我想对其应用相同的逆变换,但这将花费 waaaaay 太长的时间。如果我使用 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)
有没有人建议我如何去做这个或类似的事情或更快地实施一些事情?
谢谢!
我 运行 在不得不校正来自光谱相机的一些图像时遇到了类似的问题。我最终使用了 sp.ndimage.map_coordinates
。您必须构建一个函数,t运行s 将您的源点坐标转换为目标坐标(下例中的 dummy
函数)。我从这个问题中了解到这个t运行sformation对于一堆图像是相同的,并且你已经有了这个功能。
然后生成完整的坐标网格,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.transform.warp
扭曲 200x2000 的图像,给定使用 skimage.transform.PiecewiseAffineTransform
计算的 500 个源和目标控制点。当我 运行 在单个图像上执行此操作时,大约需要 3 秒。根据每个人的经验,这是一个合理的运行计算时间吗?
我问的原因是我可能有数百张相同尺寸的图像,我想对其应用相同的逆变换,但这将花费 waaaaay 太长的时间。如果我使用 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)
有没有人建议我如何去做这个或类似的事情或更快地实施一些事情?
谢谢!
我 运行 在不得不校正来自光谱相机的一些图像时遇到了类似的问题。我最终使用了 sp.ndimage.map_coordinates
。您必须构建一个函数,t运行s 将您的源点坐标转换为目标坐标(下例中的 dummy
函数)。我从这个问题中了解到这个t运行sformation对于一堆图像是相同的,并且你已经有了这个功能。
然后生成完整的坐标网格,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 秒。在我的电脑上