OpenCVのチュートリアルをやる

#前書き
OpenCVの開発環境は作ったので、実際になにか動かしてみます。
今回はOpenCV-Pythonのチュートリアル、[OpenCV-Python Tutorials](https://opencv-python-tutroals.readthedocs.io/en/latest/)の**[日本語版](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/index.html)**をやっていきます。
多少アレンジすると思う。

# シリーズ
* [pythonでOpenCV使うための環境づくり](https://qiita.com/Ryo87/items/939b370c06c60c9d63c8)
* [OpenCVのチュートリアルをやる](https://qiita.com/Ryo87/items/c20be948d261f1be2f22)
* [OpenCVのチュートリアルをやる -その2 変換系-](https://qiita.com/Ryo87/items/6f367bf1eb69c4f3c80e)
* [OpenCVのチュートリアルをやる -その3 -](https://qiita.com/Ryo87/items/0ffc633fb918cb704566)

#開発環境
機種名 : MacBook Pro
OS : Mojave 10.14.2
プロセッサ名 : Intel Core i5 2.6 GHz
メモリ : 16 GB
グラフィック : Intel Iris 1536MB

## python系
```
% pip freeze
numpy==1.15.4
opencv-python==4.0.0.21
```

## 画像データ
神奈川大学から画像データをお借りしてやります。
[神奈川工科大学 情報学部 情報工学科 信号処理応用研究室](http://www.ess.ic.kanagawa-it.ac.jp/app_images_j.html#image)

#本題
## 画像を扱う
> ここでは画像ファイルを読み込む方法，表示する方法，保存する方法を学びます
以下の関数の使い方を学びます : cv2.imread(), cv2.imshow() , cv2.imwrite()
さらに，Matplotlibを使った画像の表示方法も学びます

読み込んで、表示するところまで。
おそらく後で、加工して保存したりするからここではスキップ。

```sample.py
import numpy as np
import cv2

# 読み込み
## cv2.IMREAD_COLOR : カラー画像として読み込む．画像の透明度は無視される．デフォルト値
## cv2.IMREAD_GRAYSCALE : グレースケール画像として読み込む
## cv2.IMREAD_UNCHANGED : アルファチャンネルも含めた画像として読み込む
img = cv2.imread('Lenna.bmp',cv2.IMREAD_UNCHANGED)

# 表示
# Windowのサイズ可変もできるみたいだけど
# 今回は特に気にしないから放置

## window名,対象画像
cv2.imshow('image',img)
## 何かしらのキー入力があるまで待機
cv2.waitKey(0)
## すべてのWindowを閉じる
cv2.destroyAllWindows()
```
<img width="458" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/35860/7040b8f7-520b-e72b-1c51-cba001f89e3f.png">
NSFW [レナさん](https://gigazine.net/news/20090618_lenna/)

## 基本的な処理

ここはしっかりやりますかね。

### セルの色の取得
BGR値です。index = 0が「青」表してるということです。RGBじゃないのね。

```sample.py
import numpy as np
import cv2

# カラー画像読み込み
img = cv2.imread('Lenna.bmp')

# BGR値
px = img[100,100]
print ("BGR:" + str(px))

# 青
blue = img[100,100,0]
print("青:" + str(blue))

# よりよい画素へのアクセス方法と変更方法
red = img.item(100,100,2)
print ("赤:" + str(red))

print ("属性値:" + str(img.shape))
print ("合計画素数:" + str(img.size))
print ("データ型:" + str(img.dtype))

```

```zsh
% python sample.py
BGR [ 84  45 129 ]
青 84
赤 129
属性値 (256, 256, 3)
合計画素数 196608
データ型 uint8
```
## 画像中の注目領域(ROI:Region of Interest)
```sample.py
import numpy as np
import cv2

# カラー画像読み込み
img = cv2.imread('Lenna.bmp')

# 指定領域で切り抜いて
x1 = 130
y1 = 170
x2 = 160
y2 = 185
lips = img[y1:y2, x1:x2]
# 指定範囲に貼り付け(サイズが違うと怒られた。)
img[y1+50:y2+50, x1:x2] =  lips

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

<img width="458" alt="image-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/35860/ef384c53-3f1f-dfa8-5e08-6115d2045a96.png">

肩口にキスマークならぬ、唇コピペしたらセクシーになるかと思ったんだけどな。。。怖い。

## 画像の色成分の分割と統合
```
import numpy as np
import cv2

# カラー画像読み込み
img = cv2.imread('Lenna.bmp')

# bgr分割
b,g,r = cv2.split(img)

cv2.imshow('Blue',b)
cv2.imshow('Green',g)
cv2.imshow('Red',r)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

```
<img width="921" alt="Green_と_Red_と_image.png" src="https://qiita-image-store.s3.amazonaws.com/0/35860/cf22c32d-9425-9db8-67d9-4e316d6931fb.png">

BGRだからもっと緑なら緑色になるのかと思ったら、抽出した値でグレースケール画像にしてるのね。

そういうことなら

```sample.py
import numpy as np
import cv2

# カラー画像読み込み
img = cv2.imread('Lenna.bmp')

# bgの成分を0に
img[:,:,0] = 0
img[:,:,1] = 0
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

<img width="458" alt="image-3.png" src="https://qiita-image-store.s3.amazonaws.com/0/35860/9e29accc-2df2-2772-5b41-431482ff0b17.png">

イメージ通りの画像が出てきた。

## 画像の境界領域を作る(パディング)
先程の唇画像を。

<img width="458" alt="image-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/35860/ef384c53-3f1f-dfa8-5e08-6115d2045a96.png">

```
import numpy as np
import cv2

# カラー画像読み込み
img = cv2.imread('Lenna.bmp')

# 指定領域で切り抜いて
x1 = 130
y1 = 170
x2 = 160
y2 = 185
lips = img[y1:y2, x1:x2]
# 唇画像に縁をつける
# BORDER_CONSTANT:単一色の境界を追加します．次の引数で色の指定をします．
BLUE = [255,0,0]
constant = cv2.copyMakeBorder(lips,3,3,3,3,cv2.BORDER_CONSTANT,value=BLUE)

# 指定範囲に貼り付け
print(constant.shape)
img[y1+50-3:y2+50+3, x1-3:x2+3] = constant

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
<img width="458" alt="image-4.png" src="https://qiita-image-store.s3.amazonaws.com/0/35860/30a190a3-5e55-b1eb-ae35-fd73856e3c6d.png">

唇に枠が付きました。

#感想
画像処理は目に見えて結果が見えるから面白いっすね。