灰度图像不是 jpeg

Grayscale image not a jpeg

我创建了这样的灰度图像

def create_new_image(size, luminance):
    width, height = size
    black_frame = int(luminance) * np.ones((width, height, 1), dtype=np.uint8)
    return black_frame

其中亮度是 [0, 255] 的元素

我已经用imageio保存了图片

def save_image(image, output_path):
    imageio.imwrite(output_path, image)

其中 output_path 类似于 /valid_path/img.jpg

现在我想加载我的灰度图像:

img = imageio.imread(file, format ='jpg')

但我得到的是语法错误。

raise SyntaxError("not a JPEG file")
  File "<string>", line None
SyntaxError: not a JPEG file

如果我不指定格式,我会收到另一个错误。

    "Could not find a format to read the specified file in %s mode" % modename
ValueError: Could not find a format to read the specified file in single-image mode

为什么? 谢谢

JPEG 文件(压缩图像)以始终包含标记代码十六进制值 FF D8 FF 的图像标记开头。它没有嵌入文件的长度,因此我们需要找到 JPEG 预告片,即 FF D9。

请参阅 this page 中使用 link 的文档。

例如,使用十六进制查看器(例如 Hex Viewer)打开 jpeg 图像,您应该看到如下内容:

解决方法:换句话说,尝试在文件中添加header,然后再将其保存为JPEG,应该可以解决您的问题。

可以找到包含 API 文档的页面 here。按照文档,您应该找到使您指定保存格式的正确说明(正如@Meto 在答案中指出的那样)。

结论:解决方案就是在将图像物理写入硬盘时指定格式:

imageio.imwrite(uri, im, format=None, **kwargs)

你的情况 format=jpg

此外,

 imageio.show_formats()

显示格式精美的可用格式列表。

总结,尝试替换

imageio.imwrite(output_path, image)

imageio.imwrite(output_path, image, format ='jpg' )

请注意每个答案的解决方案始终相同。我刚刚添加了指定格式时发生的情况(即,只写正确的 header)。

你可以试试:

def save_image(image, output_path):
    imageio.imwrite(output_path, format= "jpg", image)

明确声明它是一个 jpg 文件。

这有效(在 jupyter notebook 中验证)

import numpy as np
import imageio

def create_new_image(size, luminance):
    width, height = size
    black_frame = int(luminance) * np.ones((width, height, 1), dtype=np.uint8)
    return black_frame

def save_image(image, output_path):
    imageio.imwrite(output_path, image)

img = create_new_image((256, 256), 125)
save_image(img, "test.jpg")
img1 = imageio.imread("test.jpg", format ='jpg')

您需要确定您的文件是否真的保存为JPG 文件。 在 Linux/Mac 上,您可以使用 file 命令来验证这一点。

例如,下面的命令确认 fireside.jpg 是一个 JPEG 文件:

# file fireside.jpg
fireside.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 2048x1365, components 3

如果文件未保存为 JPG,请尝试指定文件格式="jpg" 为

imageio.imwrite(output_path, image, format ='jpg')