OpenCVの勉強①（インストール、画像処理）

# OpenCVのインストール
Anacondaには、定番のライブラリがパッケージされていますが、OpenCVは入っていないので自分でインストールする必要があります。
ライブラリをインストールするのは、以下のコマンドを入力します。

`pip install "ライブラリ名"`

Anaconda PromptでOpenCVをインストールしてみましょう。

```
$ pip install opencv-python

Collecting opencv-python
  Downloading https://files.pythonhosted.org/packages/a3/50/04d0669afe884f137c2f490642756e8c4a658254300a9eaf253d1e643085/opencv_python-4.1.0.25-cp37-cp37m-win_amd64.whl (37.3MB)
    100% |████████████████████████████████| 37.4MB 617kB/s
Requirement already satisfied: numpy>=1.14.5 in c:\anaconda3\lib\site-packages (from opencv-python) (1.16.2)
Installing collected packages: opencv-python
Successfully installed opencv-python-4.1.0.25
```

「Successfully installed opencv-python」と表示されたらインストール成功です。
念のためインストールされているかどうか確認しましょう。
インストール済みのライブラリを一覧を確認するコマンドは以下の通りです。

`pip freeze`

ついでに、「numpy」、「matplotlib」も一覧にあるかどうか確認し、インストールされていない場合は、インストールしておきましょう（今後しょっちゅう使います）

* Numpyは配列を作成するためのライブラリで、画像データの表現に利用します。
* matplotlibはグラフ表示をするためのライブラリで、ヒストグラムの表示で利用します。

続いて、pythonインタプリタで「cv2」をインポートしてバージョンを確認してみます。


```python
>>> import cv2
>>> print(cv2.__version__)
4.1.0 #←OpenCVのバージョン
```

# 画像の表示
OpenCVで下の画像(hisyo.jpg)を表示します。
画像はPythonファイルと同じディレクトリに保存します。

![hisyo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/1299444a-fdb3-2acb-0ca8-54702f2aa89d.jpeg)


```img_show.py
#cv2をインポート
import cv2

#"hisyo.jpg"を変数"filename"に代入
filename = "hisyo.jpg"
#ファイルから画像データを読み込む関数
img = cv2.imread(filename)
#画像をウィンドウに表示する関数
cv2.imshow("image", img)
#キーイベントを待つ関数。0の場合はキーが押されるまで待つ）
cv2.waitKey(0)
```
これで「image」というウィンドウ名で画像ファイルが表示されます。

# 画像の属性情報
OpenCVで画像の属性情報を表示します。

```img_property.py
import cv2

filename = "hisyo.jpg"
img = cv2.imread(filename)

print(img.shape)
# (1136, 1600, 3)  ←(縦pixel size, 横のpixel size, 色の深さ=RBG=3色)

print(type(img))
# <class 'numpy.ndarray'>  ←NumPyの配列(ndarray)で配列されている

print(img.dtype)
# uint8  ←8ビットの符号なし整数
```

#ヒストグラムの表示
matplotlib.pyplotを使ってヒストグラムを表示します。

```histogram_mono.py
import cv2
#matplotlib.pyplotをインポート。名前が長いので以下pltと呼ぶ。
import matplotlib.pyplot as plt

img = cv2.imread('hisyo.jpg')

#Matplotlibはヒストグラムを描画する関数
plt.hist(img.ravel(),256,[0,256]); plt.show()
```
![histgram_mono.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/bbe7ced0-f7ce-55aa-05ff-1c2f41de3f4b.png)

```histogram_color.py
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('hisyo.jpg')

color = ('b','g','r')
for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])
plt.show()
```
![histogram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/32a501f1-4631-ead4-9643-35276f2b4d72.png)


# ネガポジ変換

取り込んだ画像をネガポジ変換してみる。

```nega.py
import cv2

filename = "hisyo.jpg"
img = cv2.imread(filename)

# ネガポジ変換
nega = 256 - img  #8ビットカラー(256色)をひっくり返すイメージ
# ファイルに保存する関数
cv2.imwrite("nega.jpg", nega)
```
![nega.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/f03a57a5-904c-876b-d550-9133e09d4dee.jpeg)


# グレースケール（モノクロ）変換

グレースケール（モノクロ）に変換してみる。

```mono.py
import cv2

filename = "hisyo.jpg"
img = cv2.imread(filename)

# モノクロに変換する関数
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# ファイルに保存する関数
cv2.imwrite("mono.jpg", mono)
```
![mono.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/d25771ee-4565-774a-e9ed-beb19b6f3725.jpeg)

以上、OpenCVを使った画像処理の基本でした。