英文:
Need help in Image.save()
问题
我正在努力保存一个 .tiff 文件,代码如下:
image_array = np.vstack(band1, band2, band3)
image = Image.fromarray(image_array, mode='RGB')
file_name = 'img2.tiff'
image.save(file_name, format='TIFF')
但是它给我报错:
***错误:参数超出范围 ***
由于我正在处理一个非常大的文件和大型数据集,我在第二个图像上遇到了问题,但第一个图像也很大,只是形状稍小。我该怎么办?
我期望代码能够运行并使用 PIL 库中的此函数保存文件,以便我可以预处理数据。
英文:
I am working on save a .tiff file from an array the code is :
image_array = np.vstack(band1,band2,band3)
image=Image.fromarray(image_array,mode='RGB')
file_name='img2.tiff'
image.save(file_name,format='TIFF')
But it is giving me error:
***error: argument out of range ***
As I am working on a very large file and large dataset. I am facing problem for the 2nd image but the 1st image is also very big but a little bit small in shape. What should I do
I was expecting the code to run and save the file using this fnx. from PIL library, so that I can pre-process the data
答案1
得分: 0
正如 @cgohlke 在评论中指出的,如果文件未经压缩,则超过4GB。因此,这将需要使用 PIL 无法写入的 BigTIFF。您可以通过以下方式查看:
import numpy as np
from PIL import Image
# 合成与您的大小相同的图像数据
d = np.zeros((32797, 44161, 3), np.uint8)
# 检查大小
print(d.size) # 打印 4,345,044,951 - 对于普通的 TIFF 来说太大了
# 转换为 PIL 图像
im = Image.fromarray(d)
# 尝试保存
im.save("result.tif") # 错误 'L' 格式要求 0 <= number <= 4294967295
# 尝试保存压缩 - 可行
im.save("result.tif", compression='tiff_lzw')
因此,令人不满的是,您依赖于压缩来保存图像,尽管这可能有效。我认为您最好采纳 Christoph 的建议并使用 tifffile 或另一个库,比如 wand
。
如果您的数据是卫星图像,通常会有大面积的黑色区域,这是由于地球旋转导致的区域偏移,这些区域应该很容易压缩,因此可能对您有利。
我注意到 OpenCV 也可以保存您的文件,它也使用无损的 LZW 压缩。
import cv2
# 使用上述的 Numpy 数组 'd' 以 TIFF 格式写入
cv2.imwrite('result.tif', d)
然而,如果您提供的数据不够可压缩,它也会失败:
# 生成不够可压缩的数据
d = np.random.randint(0, 256, (32797, 44161, 3), np.uint8)
cv2.imwrite('result.tif', d) # 失败
英文:
As @cgohlke points out in the comments, your file exceeds 4GB if uncompressed. As such, that would require a BigTIFF which PIL cannot write. You can see this with:
import numpy as np
from PIL import Image
# Synthesize image data same size as yours
d = np.zeros((32797,44161,3), np.uint8)
# Check size
print(d.size) # prints 4,345,044,951 - too big for regular TIFF
# Make into PIL Image
im = Image.fromarray(d)
# Try to save
im.save("result.tif") # ERROR 'L' format requires 0 <= number <= 4294967295
# Try to save compressed - WORKS
im.save("result.tif", compression='tiff_lzw')
So, it is rather unsatisfactory that you are reliant on compression to be able to save your image - though it may work. I think you would be well advised to take Christoph's advice and use tifffile or another library - such as wand
.
If your data is satellite imagery, there are often large areas of black where the swathes are offset as a result of Earth's rotation, these should be readily compressible so that may work in your favour.
I note that OpenCV can save your file and it too uses lossless LZW compression.
import cv2
# Write Numpy array 'd' from above as TIFF
cv2.imwrite('result.tif', d)
However, it too fails if you give it less compressible data:
# Make less compressible data
d = np.random.randint(0, 256, (32797,44161,3), np.uint8)
cv2.imwrite('result.tif', d) # !!! FAILS !!!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论