Ошибка при загрузке JPG-изображения, сохраненного из TIFF: size.width>0 && size.height>0 в функции ‘imshow’

Вопрос или проблема

У меня есть изображение TIFF, которое я сохраняю в формате JPG с помощью OpenCV, но когда я пытаюсь загрузить сохранённый JPG файл, я получаю следующую ошибку:

cv2.error: OpenCV(4.10.0) /io/opencv/modules/highgui/src/window.cpp:973: ошибка: (-215:Не выполнено условие) size.width>0 && size.height>0 в функции 'imshow'

Вот код, который я использую для сохранения TIFF в JPG:

Если я смотрю на этот атрибут изображения в Ubuntu, отображается количество пикселей, и объем большой, но когда он импортируется, размер равен 0!!! 🙁

image = tifffile.imread("input_image.tiff")
image = image[y1:y2, x1:x2]
cv2.imwrite("output_image.jpg", image)

После сохранения изображения в формате JPG, когда я пытаюсь загрузить его с помощью OpenCV:

img = cv2.imread("output_image.jpg")
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Я получаю вышеупомянутую ошибку. Похоже, что файл сохранён, но я не могу его успешно загрузить.

Изображение не пустое (не 0 байт, более 30 Мбайт).
-> и это слишком большой файл для jpg, так же как и для png

Изображение TIFF загружается корректно, и я могу работать с ним до его сохранения в формате JPG.

Файл JPG кажется созданным, но он вызывает проблемы при загрузке.

Когда я сохраняю изображение в формате PNG, всё работает нормально без ошибок.

Проблема в том, что размер файла PNG слишком большой, поэтому мне нужно сохранить его в формате JPG, чтобы уменьшить размер файла при сохранении приемлемого качества.

Кто-нибудь сталкивался с этим раньше? Как я могу правильно сохранить изображение TIFF в формате JPG, не сталкиваясь с этой ошибкой?

Ответ или решение

Когда вы сталкиваетесь с ошибкой при загрузке изображения JPG, сохраненного из TIFF, и видите сообщение:

cv2.error: OpenCV(4.10.0) /io/opencv/modules/highgui/src/window.cpp:973: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'

это указывает на то, что размер изображения, попытка загрузить которое вызывает проблему, равен нулю (width и height). Несмотря на то, что файл существует и его размер достаточно велик (более 30MB), это не гарантирует корректность сохраненного содержимого.

Анализ проблемы

  1. Неправильное хранение данных: Существует вероятность, что данные, которые вы пытаетесь сохранить в JPG, не могут быть корректно преобразованы в данный формат. TIFF и JPG используют разные алгоритмы сжатия, и возможно, что некоторые каналы вашей оригинальной картинки (например, альфа-канал) не обрабатываются OpenCV корректно при сохранении JPG.

  2. Срез изображения: Вы используете срез image = image[y1:y2, x1:x2]. Если после применения этого среза ваши координаты выходят за пределы исходных размеров изображения или если результатом среза является пустой массив, он будет обрабатываться неправильно.

  3. Формат данных: Убедитесь, что данные, которые вы читаете из TIFF, находятся в ожидаемом формате (например, uint8). Когда данные не приведены к правильному формату, OpenCV может не уметь обработать их и, как следствие, не сможет сохранить.

Решения

  1. Проверьте срез: Убедитесь, что после применения среза ваше изображение не пустое. Можно добавить кода для проверки формы:

    print(image.shape)
    if image.size == 0:
        raise ValueError("Изображение пустое после среза.")
  2. Проверка типа данных: Убедитесь, что тип массива — uint8. Если это не так, преобразуйте его:

    image = image.astype(np.uint8)
  3. Пробуйте другую библиотеку для сохранения: Если проблема продолжает повторяться, вы можете использовать альтернативные библиотеки для сохранения изображений, такие как PIL или imageio:

    from PIL import Image
    img = Image.fromarray(image)
    img.save("output_image.jpg", "JPEG")
  4. Проверка на наличие альфа-канала: Если ваш TIFF содержит альфа-канал, попробуйте удалять его:

    if image.shape[-1] == 4:  # Проверка на наличие альфа-канала
        image = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)
  5. Файл JPG: После выполнения всех шагов попробуйте еще раз загрузить изображение JPG. Если оно сохранено корректно, то ошибка должна исчезнуть.

Заключение

Сохранение изображений из одного формата в другой может быть не столь тривиальным процессом, как это может показаться на первый взгляд. Следование вышеописанным шагам поможет вам обойти возникшую проблему и корректно сохранить ваше TIFF изображение в JPG. Так вы сможете добиться нужного уменьшения размера файла без потери качества.

Оцените материал
Добавить комментарий

Капча загружается...