Как я могу прочитать этот JPEG с iPhone? ни PIL, ни OpenCV не могут этого сделать

Я пытаюсь открыть изображение iPhone в блокноте Jupyter. Это расположение моего изображения на жестком диске: /Users/admin/work/img_2581.jpg; это местонахождение моего блокнота Jupyter: /Users/admin/work/Untitled.ipynb. Однако я не могу загрузить изображение в блокнот Jupyter.

Путь к изображению: path = '/Users/admin/work/img_2581.jpg'

Местонахождение блокнота: /Users/admin/work/Untitled.ipynb

Сначала я попытался использовать OpenCV, чтобы открыть изображение в блокноте Jupyter. Вот что я сделал:

Изображение OpenCV читается: img = cv2.imread(path)

Я попытался напечатать форму изображения: print(img.shape). Однако я получил следующую ошибку:

AttributeError: 'NoneType' object has no attribute 'shape'

Чтобы проверить правильный путь к изображению, я использовал простой оператор Python open():

f = open("../work/img_2581.jpg", "r")
print(f)

Выход: <_io.TextIOWrapper name='../work/img_2581.jpg' mode='r' encoding='UTF-8'>

Увидев, что OpenCV не работает, я попробовал использовать Pillow:

from PIL import Image

img = Image.open(path)

Следующее исключение произошло, когда я попробовал Pillow:

---------------------------------------------------------------------------
UnidentifiedImageError                    Traceback (most recent call last)
Input In [14], in <cell line: 3>()
      1 from PIL import Image
----> 3 img = Image.open(path)

File ~/opt/anaconda3/lib/python3.9/site-packages/PIL/Image.py:3283, in open(fp, mode, formats)
   3281     warnings.warn(message)
   3282 msg = "cannot identify image file %r" % (filename if filename else fp)
-> 3283 raise UnidentifiedImageError(msg)

UnidentifiedImageError: cannot identify image file '/Users/admin/work/img_2581.jpg'

Я увидел на этом веб-сайте, что возможная проблема заключалась в том, что изображение было повреждено. Тем не менее, я могу открыть его без каких-либо проблем.

Мои вопросы заключаются в следующем:

(1) Почему в OpenCV img принимает значение None, когда импортируемое изображение существует?

(2) Что вызывает UnidentifiedImageError в подушке?

(3) Как я могу решить эти проблемы?

ваша картинка либо странный JPEG, либо вообще не JPEG. Apple могла бы поместить в файл другие данные и просто назвать его «jpeg», чтобы не пугать своих пользователей. пожалуйста, представьте этот файл (не на хостинге изображений, потому что они конвертируют изображения!) или используйте шестнадцатеричный редактор и покажите нам первые несколько шестнадцатеричных строк файла.

Christoph Rackwitz 08.02.2023 09:44

Да, вы правы - я проверил метаданные файла. Изменение формата через предварительный просмотр помогло.

ganeshravisankar 08.02.2023 22:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, есть две возможности:

  • либо OpenCV/PIL не может найти изображение, либо
  • они могут найти его, но не могут его прочитать.

Я рассмотрю каждую возможность в отдельном разделе.


Если OpenCV/PIL не может найти ваше изображение...

Самое простое, что нужно сделать, это выяснить, в каком каталоге работает ваш блокнот Jupyter, поэтому используйте:

!pwd

Затем вы можете определить относительный путь к вашему изображению — это путь, который НЕ начинается с косой черты.

Итак, если ваш блокнот работает в /Users/admin, вам нужно будет открыть work/img_2581.jpg без косой черты.

Если ваш блокнот работает в /Users/admin/work, вам нужно открыть img_2581.jpg без косой черты.

Если ваш блокнот работает в /Users/admin/work/someMadDirectory, вам нужно будет открыть ../img_2581.jpg без косой черты, потому что .. означает «на один уровень выше».


Если OpenCV/PIL может найти ваше изображение, но не может его прочитать...

Возможно, ваше изображение либо вообще не в формате JPEG, либо это файл JPEG с необычными характеристиками (например, 12-битный вместо 8-битного), или, скажем, JPEG2000.

Самый простой способ проверить, является ли это JPEG в Linux/macOS без установки какого-либо специального программного обеспечения:

file img_2581.jpg        # or "!file img_2581.jpg" inside Jupyter

Если у вас нет file, exiftool — отличный способ изучить изображения, поэтому я бы посоветовал:

exiftool img_2581.jpg    # or "!exiftool img_2581.jpg" inside Jupyter

Если у вас нет ни file, ни exiftool, вы можете загрузить свое изображение на https://hexed.it, скопировать первые несколько строк и вставить их в свой вопрос, чтобы мы могли их проверить.

Я использовал !pwd, чтобы узнать свой CWD, и мой блокнот работает в /Users/admin/work. Я изменил команду OpenCV на img = cv2.imread('img_2581.jpg'). Однако img все еще None.

ganeshravisankar 07.02.2023 21:59

Итак, если вы находитесь в этом каталоге, вы сможете запустить !ls -l img_2581.jpg и увидеть размер и разрешения вашего изображения?

Mark Setchell 07.02.2023 22:01

Вот что я получаю: -rw-rw-rw-@ 1 admin staff 215527 Feb 3 18:34 img_2581.jpg

ganeshravisankar 07.02.2023 22:09

Мммм! Попробуйте !file img_2581.jpg, чтобы увидеть, является ли это 12-битным JPEG или чем-то, что спутает OpenCV или PIL.

Mark Setchell 07.02.2023 22:12

В противном случае попробуйте запустить exiftool img_2581.jpg, чтобы узнать, расскажет ли это нам что-нибудь новое. Вам нужно будет отредактировать результаты в своем вопросе, а не помещать их в комментарии, потому что их будет слишком много.

Mark Setchell 07.02.2023 22:15

Или вы можете прочитать файл как двоичный и напечатать первые 30 байтов с помощью open('img_2581.jpg', 'rb').read(30)

Mark Setchell 07.02.2023 23:46

Вот что у меня получилось после пробежки open('img_2581.jpg', 'rb').read(30): b'\x00\x00\x00 ftypheic\x00\x00\x00\x00mif1miafMiHBhe'

ganeshravisankar 08.02.2023 22:21

Также... есть проблема: когда я бежал !file img_2581.jpg: img_2581.jpg: ISO Media, HEIF Image HEVC Main or Main Still Picture Profile. Я изменил расширение файла, но это все еще HEIC! Я постараюсь изменить формат и сообщу вам о результатах.

ganeshravisankar 08.02.2023 22:23

Вы можете преобразовать его с помощью ImageMagick в своем терминале, используя magick YOURFILE output.jpg

Mark Setchell 08.02.2023 23:23

Другие вопросы по теме