Bild gelesen durch skimage.io.imread haben verdächtige Form

Ich versuche, ein RGB-Bild mit dem skimage.io.imread zu lesen. Aber nach dem Lesen des Bildes, fand ich, dass die Bildform falsch ist, print(img.shape) zeigt, dass die Bildform (2,) . Der komplette Code, um das Problem zu zeigen, ist:

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

Ich habe auch versucht, das Bild mit opencv's Python-Paket zu lesen, die zurückgegebene Form ist korrekt (Höhe * Breite * 3).

Die Skimage-Version verwendet ist 0,12.3 , kann jemand erklären, gibt es etwas falsch mit meinem Weg mit dem Paket oder ist das wirklich ein Bug?

Klicken Sie auf den Link für Das Testbild

Edit1

Das Testbild wird beim Hochladen verändert, die unveränderte Version ist hier . Ich habe auch ein Problem auf dem Skimage Github Repo eröffnet, und es stellt sich heraus, dass das Testbild ein Zwei-Frame-Bild ist, aber das zweite Frame ist leer. Sie können dieses Bild als "beschädigtes" Bild betrachten.

Um das richtige Bild zu lesen, kannst du diesen Workaround, img = io.imread(/path/to/the/image, img_num=0) .

2 Solutions collect form web for “Bild gelesen durch skimage.io.imread haben verdächtige Form”

Sie können dieses Problem beheben, indem Sie skimage.io.imread() zur Verwendung von matplotlib erzwingen :

 In [131]: from skimage import io In [132]: img = io.imread('156.jpg', plugin='matplotlib') In [133]: img.shape Out[133]: (978L, 2000L, 3L) 

Ihr Bild ist wahrscheinlich ein Multi-Objekt-JPG. Wenn du versuchst, es mit PIL zu lesen (das ist das Standard-Plugin) bekommst du ein NumPy-Array, das aus zwei Objekten besteht. Das erste Objekt ist das Bild selbst und das zweite könnte ein Thumbnail sein, aber PIL behandelt es nicht richtig:

 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) 

Werfen Sie einen Blick auf diesen Thread , um mehr über dieses Problem zu erfahren.

Überprüfen Sie die Art des Bildes, das von Ihnen hochgeladen wird.

Wenn Sie ein Farbbild hochladen, erhalten Sie die Größe des Bildes zusammen mit der Anzahl der Kanäle (1920, 2560, 3) .

Solange das hochgeladene Bild ein Farbbild ist, erhältst du 3.

Oder wenn das Bild ein Graustufen- oder Binär ist, erhältst du die Größe des Bildes (1920, 2560)

Python ist die beste Programmiersprache der Welt.