PIL无法将模式F写入jpeg

JHH*_*HHP 33 jpeg fft mode ioerror python-imaging-library

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

"IOError: cannot write mode F as JPEG" 
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

sem*_*nte 43

尝试将图像转换为RGB:

...
new_p = Image.fromarray(fft_p)
if new_p.mode != 'RGB':
    new_p = new_p.convert('RGB')
...
Run Code Online (Sandbox Code Playgroud)

  • 如果图像是灰度的,该怎么办? (5认同)
  • 就用这个吧。它也适用于灰度。 (4认同)
  • 凹凸,如果我想保存为灰度怎么办? (2认同)

Him*_*tha 15

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

new_p = Image.fromarray(fft_p)
new_p = new_p.convert("L")
Run Code Online (Sandbox Code Playgroud)

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

  • 有关转换的更多信息,请访问:https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.convert (2认同)

xhe*_*x14 10

我认为可能是您的fft_p数组是浮点类型,并且图像的每个像素都应该具有 0-255 格式(即 uint8),所以也许您可以在从数组创建图像之前尝试这样做:

fft_p = fft_p.astype(np.uint8)
new_p = Image.fromarray(fft_p)
Run Code Online (Sandbox Code Playgroud)

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