如何从iPhone读取此JPEG?PIL和OpenCV都无法做到

6ioyuze2  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(182)

我正在Jupyter笔记本电脑中打开一个iPhone图片。这是我的图片在硬盘上的位置:/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不工作,我尝试使用枕头:

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)如何解决这些问题?

oalqel3c

oalqel3c1#

似乎有两种可能性:

  • 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位),或者是JPEG 2000。
在Linux/macOS上测试它是否是JPEG的最简单方法,无需安装任何特殊软件:

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,然后复制前几行并粘贴到您的问题中,以便我们检查。

相关问题