使用skimage.io.imread读取的图像形状可疑。

3

我正在尝试使用skimage.io.imread读取一张RGB图片。但是在读取图片后,我发现图片的shape不正确,print(img.shape)显示图片的shape是(2,)。完整的代码如下:

from skimage import io
img = io.imread(path/to/the/image)
print(img.shape)

我还尝试使用opencv的python包读取图像,返回的形状是正确的(高度*宽度*3)。

使用的skimage版本为0.12.3,有人能解释一下我的使用方式是否有问题或者这真的是一个bug吗?

点击链接查看测试图片

编辑1

上传时测试图片被更改了,未更改版本在这里。我还在skimage的github仓库中开了一个issue,结果发现测试图片是由两帧组成的图像,但第二帧为空。你可以将此图像视为"已损坏"的图像。

为了读取正确的图像,您可以使用这个解决方法,img = io.imread(/path/to/the/image, img_num=0)


无法复现该问题。我已经下载了图片,然后运行了你的代码(使用相同版本的skimage),获得了 (978L, 2000L, 3L) 的结果。 - Tonechas
@Tonechas,测试图片上传后发生了变化。我已经更新了测试图片的链接。正确的md5sum是6bc94ff2d3a2ea82b514051ec182ee97。这张图片应该能够复现问题。 - jdhao
我在尝试将图像上传到云端时遇到了skimage的问题,可能是由于压缩和解压缩引起的。使用了"img_num=0",问题得到了解决。 - Abhishek Tripathi
2个回答

9
您可以通过强制使用matplotlib来解决此问题:skimage.io.imread()
In [131]: from skimage import io

In [132]: img = io.imread('156.jpg', plugin='matplotlib')

In [133]: img.shape
Out[133]: (978L, 2000L, 3L)

您的图片很可能是一个多对象JPG。如果您尝试使用默认插件PIL读取它,您会得到一个NumPy数组,其中包含两个对象。第一个对象是图像本身,第二个对象可能是缩略图,但PIL无法正确处理它:

In [157]: img = io.imread('156.jpg', plugin='pil')

In [158]: img.dtype
Out[158]: dtype('O')

In [159]: img.shape
Out[159]: (2L,)

In [160]: img[0].shape
Out[160]: (978L, 2000L, 3L)

In [161]: img[1]
Out[161]: array(<PIL.MpoImagePlugin.MpoImageFile image mode=RGB size=2000x978 at 0x111DBCF8>, dtype=object)

请查看此帖子了解更多关于这个问题的信息。


是的,那个图像可以被认为是“损坏的”,因为它有两个层。但我认为明确告诉imread使用哪个插件是繁琐的,因为大多数图像都是“好的”。而且这个问题还没有解决。 - jdhao

1

检查您上传的图片类型。

如果您上传了一张彩色图片,您将会收到该图片的大小以及通道数 (1920, 2560, 3)

只要上传的图片是彩色的,您将收到3。

否则,如果图片是灰度或二值化的,则您将得到该图片的大小 (1920, 2560)


上传的原始图片在上传过程中被修改了。我已经更新了测试图片的链接,应该可以重现这个问题。 - jdhao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接