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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在python中旋转大图像(85000x85000x3)相关的知识,希望对你有一定的参考价值。

有没有人知道可以用来旋转非常大的图像的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,因为它不支持如此大的图像。

答案

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图像。在我的台式电脑(四核,8线程i7加上SSD)上,我看到:

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

因此,峰值仅超过1GB的内存和57s的实时时间。

以上是关于在python中旋转大图像(85000x85000x3)的主要内容,如果未能解决你的问题,请参考以下文章

从文件上传读取网址时图像自动旋转(当它是大图像时)?

在 Python 中使用滚动条显示大图像

在大图像中使用 findCirclesGrid()

如何使用 Open CV 3 python 3 用鼠标从大图像中裁剪 ROI

如何使用python中的平移矩阵将小图像的特定坐标放置到大图像的特定坐标

裁剪大图像周围的空白区域