Изображение в градациях серого не в формате JPEG - PullRequest
3 голосов
/ 17 марта 2020

Я создал изображение в градациях серого, как это

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

Почему? Спасибо

Ответы [ 4 ]

3 голосов
/ 23 марта 2020

Вы можете попробовать:

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

, чтобы явно указать, что это файл jpg.

1 голос
/ 19 марта 2020

Файлы JPEG (сжатые изображения) начинаются с маркера изображения, который всегда содержит шестнадцатеричные значения кода маркера FF D8 FF. В него не встроена длина файла, поэтому нам нужно найти трейлер JPEG, который является FF D9.

См. Документацию, используя ссылку на эту страницу .

Например, открытие изображения в формате JPEG с помощью шестнадцатеричной программы просмотра (например, Hex Viewer * 1008) *), вы должны увидеть что-то вроде этого:

enter image description here

Решение : Другими словами, попробуйте добавить заголовок к файл перед сохранением его в формате JPEG, вы должны решить вашу проблему.

Страница с документацией API находится здесь здесь . Следуя do c, вы должны найти правильную инструкцию, которая заставляет вас указать формат для сохранения (как указано @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' )

Обратите внимание , что решение всегда одинаково в каждом ответе , Я только что добавил, что происходит с указанием формата (т.е. просто пишет правильный заголовок).

0 голосов
/ 26 марта 2020

Вы должны убедиться, что ваш файл действительно сохранен как файл JPG. В Linux / Ma c вы можете использовать команду 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')
0 голосов
/ 25 марта 2020

Это работает (проверено в блокноте jupyter)

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')
...