在python中旋转大图像(85000x85000x3)

时间:2017-06-03 01:06:31

标签: python image opencv scipy rotation

有没有人知道可以用来旋转非常大的图像的python库?我需要确保图像使用相同的颜色,并且没有插值,即我必须使用最近邻旋转。

图片格式为tiff。我正在使用NVIDIA DGX来处理它,这台服务器可容纳512 GB的系统内存。

OPENCV

我尝试使用opencv:

M = cv2.getRotationMatrix2D((w/2,h/2),angle,1)
im_rgb_rot = cv2.warpAffine(im_rgb,M,(w,h),flags=cv2.INTER_NEAREST)

似乎在轮换后im_rgb_rot变成一个由全零组成的空白图像。

SciPy的

此外,我尝试使用scipy.ndimage.interpolation.rotatescipy.misc.imrotate并在一个小的测试图像上,但似乎旋转不会给我直边,如下所示。我应该注意opencv给出了直边。

enter image description here

这个代码是:

scipy.ndimage.interpolation.rotate(im_test, 40, reshape=False, mode='nearest')

PIL

最后,我不能使用PIL,因为它不支持如此大的图像。

1 个答案:

答案 0 :(得分:0)

pyvips可以使用一点点内存快速处理大图像。

要将大图像旋转20度,您可以写:

import pyvips

x = pyvips.Image.new_from_file("M7_KM-1.tif")
x = x.rotate(20, interpolate=pyvips.Interpolate.new("nearest"))
x.write_to_file("x.tif", compression="jpeg", tile=True)

其中M7_KM-1.tif是65k x 65k像素平铺JPG压缩的TIFF图像。在我的桌面PC上(四核,8线程i7加一块SSD),我看到了:

$ /usr/bin/time -f %M:%e python3 rot.py 
1066960:54.06

这是一个超过1GB的内存峰值和57秒的实时时间。