61

我正在拍摄 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()
4

3 回答 3

65

尝试将图像转换为 RGB:

...
new_p = Image.fromarray(fft_p)
if new_p.mode != 'RGB':
    new_p = new_p.convert('RGB')
...
于 2013-09-18T18:13:41.347 回答
39

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

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

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

于 2018-08-18T14:28:54.253 回答
12

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

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

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

于 2020-02-01T04:54:00.230 回答