macOS의 scikit-image에서 이미지 표시(pyenv/Python 3)

macOS에서 pyenv를 사용하여 설정 한 Python 환경에서 scikit-image을 사용할 때의 이야기.

scikit-image에서 이미지 표시를 시도하면 플러그인으로 matplotlib을 사용해야합니다.
macOS에서 pyenv로 설치한 Python 환경에서는 matplotlib 의 backend를 변경하지 않으면 오류가 나오고 움직이지 않으므로 해결 방법.

결론을 먼저 쓰면 matplotlib의 백엔드를 TkAgg 또는 Qt5Agg로 한다(필요한 라이브러리는 인스톨 하는 전제).

환경


  • macOS Sierra
  • Python 3.5 (pyenv)
  • scikit-image

  • scikit-image 설치 절차



    애초에 어떻게 설치했는가 하면 아래의 순서.
    $ pip install -U scikit-image
    $ pip install scipy
    $ pip install matplotlib
    
    pippyenv 에서 설치한 Python 3.5.3의 것.

    하고 싶은 일



    scikit-image 이라는 라이브러리의 io.show() 로 이미지를 표시하고 싶다.

    문제



    아무것도 생각하지 않고 pip 로 scikit-image 패키지를 인스톨 하면 , 이하의 에러가 발생해 화상을 표시할 수 없다.io.show() 를 호출하여 이미지를 표시하고 싶지만 그 전에 io.imshow() 로 표시할 이미지를 할당해야 합니다.
    이 시점에서 RuntimeError.
    >>> io.imshow(img)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/atuyosi/.pyenv/versions/3.5.3/lib/python3.5/site-packages/skimage/io/_io.py", line 156, in imshow
        return call_plugin('imshow', arr, plugin=plugin, **plugin_args)
      File "/Users/atuyosi/.pyenv/versions/3.5.3/lib/python3.5/site-packages/skimage/io/manage_plugins.py", line 198, in call_plugin
        raise RuntimeError(msg % kind)
    RuntimeError: No suitable plugin registered for imshow.
    
    You may load I/O plugins with the `skimage.io.use_plugin` command.  A list of all available plugins are shown in the `skimage.io` docstring.
    

    화면 표시에 이용 가능한 플러그인이 없다는 메시지와 같이, 우선 플러그인을 조사한다.
    >>> io.find_available_plugins()
    {'gdal': ['imread', 'imread_collection'], 'imread': ['imread', 'imsave', 'imread_collection'], 'simpleitk': ['imread', 'imsave', 'imread_collection'], 'test': ['imsave', 'imshow', 'imread', 'imread_collection', 'imshow_collection'], 'pil': ['imread', 'imsave', 'imread_collection'], 'matplotlib': ['imshow', 'imread', 'imshow_collection', 'imread_collection'], 'imageio': ['imread', 'imsave', 'imread_collection'], 'qt': ['imshow', 'imsave', 'imread', 'imread_collection'], 'gtk': ['imshow'], 'freeimage': ['imread', 'imsave', 'imread_collection'], 'tifffile': ['imread', 'imsave', 'imread_collection'], 'fits': ['imread', 'imread_collection']}
    

    각 플러그인에 사용할 수 있는 기능은 플러그인 이름 뒤에 배열로 유지됩니다. imshow 에 대응하고 있는 것은, test 를 들여다보면 matplotlib 와, qt 이 중 gtk는 PyQt4를 요구한다.

    설치된 Matplotlib를 사용하려고 하면 다음 오류가 발생합니다.
    >>> io.use_plugin('matplotlib')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/atuyosi/.pyenv/versions/3.5.3/lib/python3.5/site-packages/skimage/io/manage_plugins.py", line 255, in use_plugin
        _load(name)
      File "/Users/atuyosi/.pyenv/versions/3.5.3/lib/python3.5/site-packages/skimage/io/manage_plugins.py", line 299, in _load
        fromlist=[modname])
      File "/Users/atuyosi/.pyenv/versions/3.5.3/lib/python3.5/site-packages/skimage/io/_plugins/matplotlib_plugin.py", line 3, in <module>
        import matplotlib.pyplot as plt
      File "/Users/atuyosi/.pyenv/versions/3.5.3/lib/python3.5/site-packages/matplotlib/pyplot.py", line 115, in <module>
        _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
      File "/Users/atuyosi/.pyenv/versions/3.5.3/lib/python3.5/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
        globals(),locals(),[backend_name],0)
      File "/Users/atuyosi/.pyenv/versions/3.5.3/lib/python3.5/site-packages/matplotlib/backends/backend_macosx.py", line 19, in <module>
        from matplotlib.backends import _macosx
    RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.
    

    라고 말해 matplotlib 측의 백엔드 설정의 문제로 이용할 수 없다. Python 자체를 framework 형식으로 설치하라고 하는 것 같지만 과연 귀찮다.

    존재하는 플러그인이 아니라 실제로 유효한 플러그인을 조사한다.
    >>> io.find_available_plugins(loaded=True)
    {'pil': ['imread', 'imsave', 'imread_collection']}
    
    qt 라는 플러그인 밖에 유효하지 않습니다.

    해결 방법



    어떤 백엔드를 사용할 수 있도록 하면 된다. Qt4 자체가 서포트 끊어지므로 PyQt4는 그만둔다. Tk를 사용해도 좋지만, Qt5 쪽이 모던하고 좋은 것 같은 생각이 든다.

    그래서 PyQt5을 설치하고 matplotlib를 통해 사용하기로 결정합니다.

    우선 Qt5 본체를 설치.
    $ brew install qt
    

    이어 PyQt5.
    $ pip install PyQt5
    

    PyQt5-5.9가 설치됩니다. 의존관계에서 필요한 라이브러리도 마음대로 들어갈 것.

    구성 파일 수정.

    matplotlib의 설정 파일의 위치는 아래의 순서로 확인할 수 있다.
    >>> import matplotlib
    >>> matplotlib.matplotlib_fname()
    '/Users/atuyosi/.pyenv/versions/3.5.3/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc'
    

    편집기로 위의 파일을 편집.
    $ vi .pyenv/versions/3.5.3/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc
    

    백엔드를 지정하는 위치를 찾습니다.
    backend      : macosx
    

    사용할 백엔드를 지정합니다.
    backend      : Qt5Agg
    

    동작 확인



    제대로 플러그인이 유효한지 확인한다.
    >>> from skimage import io
    >>> io.use_plugin('matplotlib')
    >>> io.find_available_plugins(loaded=True)
    {'matplotlib': ['imshow', 'imread', 'imshow_collection', 'imread_collection'], 'pil': ['imread', 'imsave', 'imread_collection']}
    

    화상의 표시는 이하와 같이 한다.
    >>> from skimage import io
    >>> img =  io.imread("test.jpg")
    >>> io.imshow(img)
    <matplotlib.image.AxesImage object at 0x110ba1160>
    >>> io.show()
    ^C
    
    pil 를 호출하지 않고 io.imshow() 를 호출해도 아무것도 표시되지 않으므로 주의.

    실제 표시는 다음과 같다.

    scikit-image 라이브러리의 io.show() 모듈을 읽으면 테스트 이미지를 읽을 수 있으므로 이것을 사용한다.
    >>> from skimage import data
    >>> io.imshow(data.camera())
    <matplotlib.image.AxesImage object at 0x1138707b8>
    >>> io.show()
    



    플러그인의 순서에 따라서는 명시적으로 data 를 사용하도록 지정하면 된다.
    >>> io.use_plugin('matplotlib')
    

    참고


  • [단문 메모] matplotlib에서 show해도 아무것도 표시되지 않는다 → backend 설정 확인 - Qiita
  • Python 3.3에서 matplitlib과 pylab을 사용하려고하면 RuntimeError : Python is not installed as a framework라는 오류가 발생했을 때 해결하는 방법 - Qiita
  • matplotlib 사용하기 - abcdefg.....
  • 좋은 웹페이지 즐겨찾기