Вопрос или проблема
У меня есть изображение 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), это не гарантирует корректность сохраненного содержимого.
Анализ проблемы
-
Неправильное хранение данных: Существует вероятность, что данные, которые вы пытаетесь сохранить в JPG, не могут быть корректно преобразованы в данный формат. TIFF и JPG используют разные алгоритмы сжатия, и возможно, что некоторые каналы вашей оригинальной картинки (например, альфа-канал) не обрабатываются OpenCV корректно при сохранении JPG.
-
Срез изображения: Вы используете срез
image = image[y1:y2, x1:x2]
. Если после применения этого среза ваши координаты выходят за пределы исходных размеров изображения или если результатом среза является пустой массив, он будет обрабатываться неправильно. -
Формат данных: Убедитесь, что данные, которые вы читаете из TIFF, находятся в ожидаемом формате (например,
uint8
). Когда данные не приведены к правильному формату, OpenCV может не уметь обработать их и, как следствие, не сможет сохранить.
Решения
-
Проверьте срез: Убедитесь, что после применения среза ваше изображение не пустое. Можно добавить кода для проверки формы:
print(image.shape) if image.size == 0: raise ValueError("Изображение пустое после среза.")
-
Проверка типа данных: Убедитесь, что тип массива —
uint8
. Если это не так, преобразуйте его:image = image.astype(np.uint8)
-
Пробуйте другую библиотеку для сохранения: Если проблема продолжает повторяться, вы можете использовать альтернативные библиотеки для сохранения изображений, такие как PIL или imageio:
from PIL import Image img = Image.fromarray(image) img.save("output_image.jpg", "JPEG")
-
Проверка на наличие альфа-канала: Если ваш TIFF содержит альфа-канал, попробуйте удалять его:
if image.shape[-1] == 4: # Проверка на наличие альфа-канала image = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)
-
Файл JPG: После выполнения всех шагов попробуйте еще раз загрузить изображение JPG. Если оно сохранено корректно, то ошибка должна исчезнуть.
Заключение
Сохранение изображений из одного формата в другой может быть не столь тривиальным процессом, как это может показаться на первый взгляд. Следование вышеописанным шагам поможет вам обойти возникшую проблему и корректно сохранить ваше TIFF изображение в JPG. Так вы сможете добиться нужного уменьшения размера файла без потери качества.