Moduł scipy.misc nie ma atrybutu imread?


125

Próbuję odczytać obraz za pomocą scipy. Jednak nie przyjmuje scipy.misc.imreadczęści. Co może być przyczyną tego?

>>> import scipy
>>> scipy.misc
<module 'scipy.misc' from 'C:\Python27\lib\site-packages\scipy\misc\__init__.pyc'>
>>> scipy.misc.imread('test.tif')
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    scipy.misc.imread('test.tif')
AttributeError: 'module' object has no attribute 'imread'

której wersji scipy używasz? scipy.__version__daje 0.9.0mi i nie mogę odtworzyć twojego problemu
hannes

czy otrzymujesz ten sam błąd, jeśli to zrobisz from scipy.misc import imread, a następnie imread('test.tif')?
karthikr

@karthikr tak, otrzymuję ten sam błąd.
ustroetz

4
Myślę, że ta funkcja zależy od zainstalowanego PIL ( pythonware.com/products/pil ). Czy masz PIL?
Wilduck

6
imreadzostał uznany za przestarzały w SciPy 1.0.0 i został usunięty w wersji 1.2.0. Użyj imageio.imreadzamiast tego.
Manas

Odpowiedzi:


137

Musisz zainstalować Pillow (dawniej PIL ). Od docs na scipy.misc:

Zwróć uwagę, że Pillow nie jest zależnością od SciPy, ale funkcje manipulacji obrazem wskazane na poniższej liście nie są dostępne bez niej:

...

imread

...

Po zainstalowaniu Pillow mogłem uzyskać dostęp imreadw następujący sposób:

In [1]: import scipy.misc

In [2]: scipy.misc.imread
Out[2]: <function scipy.misc.pilutil.imread>

Orz, ale jeśli zainstaluję PIL, to da mi<PngImagePlugin.PngImageFile...
Allan Ruin

21
Teraz powinna to być Poduszka zamiast PIL. Źródła
Yuchen Zhong

Uratowałeś mi dzień - ale dlaczego dokumentacja scipy jest taka kiepska! Moje kroki to install numpy + MKL> Pillow> Scipy, wszystkie są pobierane z University of California w Irvine skompilowane moduły Pythona dla systemu Windows.
SIslam

4
PRZECZYTAJ KOLEJNĄ ODPOWIEDŹ ( odpowiedź @ Shadab) i zauważ, że po prostu imageionie scipy.imageio.
Terry Brown

4
Zwróć uwagę, że nie działa to z najnowszą wersją SciPy (1.3.0). Rozwiązanie firmy Shadab działa.
Nikhil Gupta

106

imreadjest przestarzałe w SciPy 1.0.0 i zostanie usunięte w 1.2.0. Użyj imageio.imreadzamiast tego.

import imageio
im = imageio.imread('astronaut.png')
im.shape  # im is a numpy array
(512, 512, 3)
imageio.imwrite('imageio:astronaut-gray.jpg', im[:, :, 0])

12
Imread SciPy był używany do zwracania numpy.ndarray. imageio.imread zwraca imageio.core.util.Array. Jeśli chcesz / potrzebujesz numpy.ndarray i nie chcesz go konwertować, użyj matplotlib.pyplot.imread, ponieważ zwraca również numpy.ndarray.
Stefan

1
Mam tutaj podobny problem, ale w odniesieniu do imresize. Wcześniej scipy.misc.imresizedziała. Teraz jest przestarzały i gdzie znajdę alternatywę?
saichand

To żart @saichand
filip

1
@filip, próbowałem użyć scipy.misc.imresize. Teraz nie działa, ale kiedyś go użyłem. Chciałbym, żebyś mógł mnie poprawić, jeśli to, co powiedziałem, zawierało jakieś błędy w tym komentarzu, zamiast powiedzieć to jako żart. Jestem otwarty na naukę na błędach. Co jest nie tak w moim komentarzu? Dziękuję Ci.
saichand

No cóż, muszę przyznać, że byłem trochę sfrustrowany moim komentarzem, kiedy to napisałem: P. Miałem na myśli, że to żart, że nie dostarczyli kół ani instalacji poniżej 1.0 dla scipy na Windowsie. Jeśli nadal chcesz go używać, po prostu użyj scipy == 1.2.0, ponieważ nadal jest tam dostępny (tylko oznaczony jako przestarzały, nadal działa!) @Saichand
filip

48

imread jest przestarzały po wersji 1.2.0! Aby rozwiązać ten problem, musiałem zainstalować wersję 1.1.0.

pip install scipy==1.1.0

3
Zobacz odpowiedź @ Shadab, jest imageiojuż dostępna.
Terry Brown

31

W przypadku Pythona 3 najlepiej używać imreadw matplotlib.pyplot:

from matplotlib.pyplot import imread

18

Jeśli ktoś napotka ten sam problem, odinstaluj scipy i zainstaluj scipy == 1.1.0

$ pip uninstall scipy

$ pip install scipy==1.1.0

9

Potrzebujesz biblioteki Python Imaging Library (PIL), ale niestety! wydaje się, że projekt PIL został porzucony. W szczególności nie został przeniesiony do Pythona 3. Więc jeśli chcesz mieć funkcjonalność PIL w Pythonie 3, dobrze zrobisz, jeśli użyjesz Pillow , który jest półoficjalnym rozwidleniem PIL i wydaje się być aktywnie rozwijany. Właściwie, jeśli w ogóle potrzebujesz nowoczesnej implementacji PIL, polecam Pillow. To tak proste, jak pip install pillow. Ponieważ używa tej samej przestrzeni nazw, co PIL, jest zasadniczo zamiennikiem typu drop-in.

Jak „półoficjalny” jest ten widelec? możesz zapytać. Strona Informacje w dokumentach Pillow mówi tak:

W miarę upływu czasu od ostatniego wydania PIL prawdopodobieństwo nowej wersji PIL maleje. Jednak nie otrzymaliśmy jeszcze oficjalnego komunikatu „PIL nie żyje”. Jeśli więc nadal chcesz wspierać PIL, najpierw zgłoś problemy tutaj, a następnie otwórz odpowiednie bilety Pillow tutaj.

Podaj link do pierwszego zgłoszenia, abyśmy mogli śledzić problem (y) w górę strumienia.

Jednak ostatnie wydanie PIL na oficjalnej stronie PIL nosi datę 15 listopada 2009. Myślę, że możemy spokojnie ogłosić Pillow następcą PIL-u po (w chwili pisania tego tekstu) prawie ośmiu latach braku nowych wydawnictw. Więc nawet jeśli nie potrzebujesz wsparcia dla Pythona 3, sugeruję, abyś zrezygnował ze starej dystrybucji PIL 1.1.6 dostępnej w PyPI i po prostu zainstalował świeżą, aktualną i kompatybilną Pillow.


7

Zainstaluj bibliotekę Pillow, wykonując następujące polecenia:

pip install pillow

Uwaga, wybrana odpowiedź jest nieaktualna. Zobacz dokumentację SciPy

Zauważ, że Pillow ( https://python-pillow.org/ ) nie jest zależnością od SciPy, ale funkcje manipulacji obrazami wskazane na poniższej liście nie są dostępne bez niej.


6

Zgodnie z odpowiedzią misc.imread jest przestarzałe w SciPy 1.0.0 i zostanie usunięte w 1.2.0. imageio jest jedną z opcji, zwróci obiekt typu:

<class 'imageio.core.util.Image'>

ale zamiast imageio użyj cv2

import cv2
im = cv2.imread('astronaut.png')

będę typu: <class 'numpy.ndarray'>

Ponieważ tablice numpy są szybciej obliczane.


imageio działa, ale cv2 powoduje błąd: libpng ostrzeżenie: nieprawidłowa wysokość obrazu w IHDR
sailfish009



1

Potrzebujesz biblioteki obrazów Pythona ( PIL ), ale teraz sam PIL nie wystarczy, lepiej zainstaluj Pillow . To działa dobrze.


2
Na zaakceptowanej odpowiedzi jest już komentarz, który pillowpowinien być użyty zamiast PIL. Nie sądzę, aby dodanie go jako odpowiedzi było złym pomysłem, ale byłoby o wiele bardziej przydatne, gdybyś wyjaśnił dlaczego. Dzięki.
lrnzcig

1

Po uruchomieniu następujących w notatniku Jupyter, miałem podobny komunikat o błędzie:

from skimage import data
photo_data = misc.imread('C:/Users/ers.jpg')
type(photo_data)

komunikat „błąd”:

D: \ Program Files (x86) \ Microsoft Visual Studio \ Shared \ Anaconda3_64 \ lib \ site-packages \ ipykernel_launcher.py: 3: DeprecationWarning: imreadjest przestarzałe! imreadjest przestarzałe w SciPy 1.0.0 i zostanie usunięte w 1.2.0. Użyj imageio.imread zamiast tego. Jest to niezależne od pakietu ipykernel, więc możemy uniknąć importowania do

I korzystając z poniższych rozwiązań, udało mi się to rozwiązać:

import matplotlib.pyplot
photo_data = matplotlib.pyplot.imread('C:/Users/ers.jpg')
type(photo_data)

Nie ma to związku z pytaniem. To inny problem i inna odpowiedź.
Halis Yılboğa

1

Mam wszystkie pakiety wymagane do wyodrębnienia obrazu na notebooku jupyter, ale nawet wtedy pokazuje mi ten sam błąd.

Błąd w notatniku Jupyter

Czytając powyższe komentarze, zainstalowałem wymagane pakiety. Powiedz, czy przegapiłem niektóre przesyłki.

pip3 freeze | grep -i -E "pillow|scipy|scikit-image"
Pillow==5.4.1
scikit-image==0.14.2

scipy==1.2.1

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.