Pythonで画像処理 (その1)


今まで、画処理するのにImageJとかRとかMatlabとかを使ってたけど、Python( + OpenCV )でなんかやってみる試み。

# Pythonのインストール

ライブラリの依存関係等面倒なので、ここは楽してhomebrewでanacondaをインストールしておくことにする。

```Bash
% brew cask install anaconda
```

Windowsの場合は、chocolatey で choco install anaconda3とかやっておく。anacondaがインストールできたら、anacondaのパッケージシステムを使ってOpenCVをインストールする。

```Bash
% conda install --channel https://conda.anaconda.org/menpo opencv3
```

jupyter を起動して、OpenCVがインストールできていることを確認する。
![20160830001.jpg](https://qiita-image-store.s3.amazonaws.com/0/15553/aff83722-37c9-2c81-068b-6a9a6799e141.jpeg "20160830001.jpg")

jupyterが便利すぎる。jupyterのためだけにでもanacondaをインストールしたい。perlやRでも使いたい。

# 画像を読み込んで表示する
データベースといえばscott/tigerのemp、人の顔の画像といえばLennaである。

## Lennaを求めて
まずは、[SPI Image Database ](http://sipi.usc.edu/database/database.php?volume=misc)で、4.2.04.tiffという画像をダウンロードしておく。なお、Copyright的には「Scans of magazine pictures. Copyright belongs to original publisher or photographer.」のように書かれている。
事前に、画像処理系のツールをインストールしていたりすると、find /usr/local -name ‘Lenna.tiff’ -type f -print とかしてみたら、意外とどっかのディレクトリに保存されていることもある。

## 画像の表示

OpenCVを使って、画像を読み込んで表示する方法は、[OpenCVのドキュメント](http://docs.opencv.org/3.1.0/dc/d2e/tutorial_py_image_display.html)を見れば分かる。
というワケで、さっそく、jupyter notebook上でやってみる。なお、cv2.waitKey(0)してからcv2.destroyAllWindows()しているが、これはキー入力を0ミリ秒待つという意味で、この場合の0秒というのは「時間指定なし」すなわちずっと「次のキー入力を待ちます」という意味らしい。つまり、何らかのキー入力があるまでは画像ウィンドウを開いておくという指示。

```python
import numpy as np
import cv2
import os.path
lenna = "4.2.04.tiff"
if os.path.exists(lenna):
    img = cv2.imread(lenna)
    cv2.imshow("Lenna", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
```
![20160830002.jpg](https://qiita-image-store.s3.amazonaws.com/0/15553/fb21c63b-2ee1-688c-0f11-d18ff83cbbc5.jpeg "20160830002.jpg")

このLennaのことをもっと知りたいと思ったら、img.shapeとかimg.sizeとかを見ればいい。

## 画像の2値化

[OpenCVのチュートリアル](http://docs.opencv.org/trunk/d7/d4d/tutorial_py_thresholding.html)を見ると、2値化のためのコードが記載されているので、その通りやってみる。

os.path.exiss() することで、画像ファイルがあるかどうかを確認する行を入れてみた。

また、チュートリアルどおり、matplotlibを使って画像表示をするようになっている。

```python
import cv2
import numpy as np
import os.path
from matplotlib import pyplot as plt
lenna = "4.2.04.tiff"

if os.path.exists(lenna):
    img = cv2.imread(lenna,0)
    img = cv2.medianBlur(img, 5)
    ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
    th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
    th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THERSH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    
    titles = ['Original Image', 'Global Thresholding (v = 127)', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
    images = [img, th1, th2, th3]

    for i in range(0, 4):
        plt.subplot(2, 2, i+1), plt.imshow(images[i], 'gray')
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])

    plt.show()
```
![20160830003.jpg](https://qiita-image-store.s3.amazonaws.com/0/15553/3971025e-81dc-690d-0e49-cd1ffa1183d0.jpeg "20160830003.jpg")


同様に、大津法での2値化もやってみる。コードは、ほとんど変わらない。

```python
import cv2
import numpy as np
import os.path
from matplotlib import pyplot as plt
lenna = "4.2.04.tiff"
if os.path.exists(lenna):
    img = cv2.imread(lenna,0)
    img = cv2.medianBlur(img,5)
    ret,th = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    cv2.imshow("Lenna", th)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
```

![20160830004.jpg](https://qiita-image-store.s3.amazonaws.com/0/15553/5761ddf2-d6d9-fbad-cb8a-299943856c02.jpeg "20160830004.jpg")

というワケで、ひとまず、基本的なところまではできるようになった。

## 今回のコード

- https://github.com/fukuit/Python_SelfLearning/blob/master/show_image.py
- https://github.com/fukuit/Python_SelfLearning/blob/master/binarize_image.py