PIL 无法将模式 F 写入 jpeg

问题描述 投票:0回答:6

我正在拍摄 jpg 图像并使用 numpy 的 fft2 创建/保存新图像。但是它会抛出这个错误

"IOError: cannot write mode F as JPEG" 

PIL 中的 CMYK 和 JPEG 文件是否有问题???

p = Image.open('kibera.jpg')
bw_p = p.convert('L')
array_p = numpy.asarray(bw_p)
fft_p = abs(numpy.fft.rfft2(array_p))
new_p = Image.fromarray(fft_p)
new_p.save('kibera0.jpg')
new_p.histogram()
jpeg python-imaging-library fft mode ioerror
6个回答
80
投票

尝试将图像转换为 RGB:

...
new_p = Image.fromarray(fft_p)
if new_p.mode != 'RGB':
    new_p = new_p.convert('RGB')
...

51
投票

Semente 的答案适用于彩色图像 对于灰度图像,您可以使用以下内容:-

new_p = Image.fromarray(fft_p)
new_p = new_p.convert("L")

如果您对灰度图像使用

new_p = new_p.convert('RGB')
,那么该图像仍将具有 24 位深度而不是 8 位,并且将占用硬盘大小的三倍,并且它不会是真正的灰度图像。


20
投票

我认为您的

fft_p
数组可能是 float 类型,并且图像的每个像素的格式应该为 0-255 (即 uint8),所以也许您可以在从数组创建图像之前尝试执行此操作:

fft_p = fft_p.astype(np.uint8)
new_p = Image.fromarray(fft_p)

但请注意

fft_p
数组中的每个元素都应该在 0-255 范围内,因此也许您需要在之前对其进行一些处理才能获得所需的结果,例如,如果您的每个元素都是介于 0-255 之间的浮点数0 和 1 你可以将它们乘以 255。


3
投票
def save_img(img, path):

    img = Image.fromarray(img)

    img.save(path)

raise OSError(f"cannot write mode {mode} as PNG") from e

OSError:无法将模式 F 写入 PNG

这里模式

F
的含义是图像中的浮点值。因此,请在保存之前将浮点图像转换为
uint8
图像。

image.astype(np.uint8)

0
投票

如果您正在使用 PyTorch

import torchvision.transforms as T
    
        
transform=T.ToPILImage()
imt=transform(img)

0
投票

我也遇到了同样的问题,但我的图像是灰度图像,仅包含 0 到 1 之间的浮点数。 我可以通过以下方法用原始数据保存图像:

import PIL as pillow, numpy

# Normalize the image with values between 0 and 255
normalized_image = (final_image - numpy.min(final_image)) * (255.0 / (numpy.max(final_image) - numpy.min(final_image)))
normalized_image = normalized_image.astype('uint8')

# Convert the normalized numpy array to an image using Pillow
image = pillow.Image.fromarray(normalized_image)

# Save the final image
image.save('image.png')
© www.soinside.com 2019 - 2024. All rights reserved.