Я пытаюсь открыть изображение 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) Как я могу решить эти проблемы?
Да, вы правы - я проверил метаданные файла. Изменение формата через предварительный просмотр помогло.
Кажется, есть две возможности:
Я рассмотрю каждую возможность в отдельном разделе.
Если 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
.
Итак, если вы находитесь в этом каталоге, вы сможете запустить !ls -l img_2581.jpg
и увидеть размер и разрешения вашего изображения?
Вот что я получаю: -rw-rw-rw-@ 1 admin staff 215527 Feb 3 18:34 img_2581.jpg
Мммм! Попробуйте !file img_2581.jpg
, чтобы увидеть, является ли это 12-битным JPEG или чем-то, что спутает OpenCV или PIL.
В противном случае попробуйте запустить exiftool img_2581.jpg
, чтобы узнать, расскажет ли это нам что-нибудь новое. Вам нужно будет отредактировать результаты в своем вопросе, а не помещать их в комментарии, потому что их будет слишком много.
Или вы можете прочитать файл как двоичный и напечатать первые 30 байтов с помощью open('img_2581.jpg', 'rb').read(30)
Вот что у меня получилось после пробежки open('img_2581.jpg', 'rb').read(30)
: b'\x00\x00\x00 ftypheic\x00\x00\x00\x00mif1miafMiHBhe'
Также... есть проблема: когда я бежал !file img_2581.jpg
: img_2581.jpg: ISO Media, HEIF Image HEVC Main or Main Still Picture Profile
. Я изменил расширение файла, но это все еще HEIC! Я постараюсь изменить формат и сообщу вам о результатах.
Вы можете преобразовать его с помощью ImageMagick в своем терминале, используя magick YOURFILE output.jpg
ваша картинка либо странный JPEG, либо вообще не JPEG. Apple могла бы поместить в файл другие данные и просто назвать его «jpeg», чтобы не пугать своих пользователей. пожалуйста, представьте этот файл (не на хостинге изображений, потому что они конвертируют изображения!) или используйте шестнадцатеричный редактор и покажите нам первые несколько шестнадцатеричных строк файла.