画像やWebカメラを加工してみる パート１ ～色変換編～

# はじめに
Pythonを使って、画像やWebカメラを加工してみた パート１

今回は **OpenCV** を使って画像（映像）加工をやってみた
業務でOpenCVを使うことがあったので、家でちょこちょこ遊んでみた

お品書きは下記の通り

* OpenCVとは
* モジュール，ディレクトリ構造など
* RGB加工

# OpenCVとは

![OpenCV](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/c6cb003e-a83d-8261-cf70-492df38897d3.png)

OpenCV　…　パソコンで、画像や映像を処理するのに必要な機能が実装されているOSSライブラリ
画像や映像を加工するにはもってこいのライブラリとのこと
学習データと組み合わせることにより、顔認識などにも使用されている

# モジュール，ディレクトリ構造など

### モジュール
今回使用するモジュールは下記の通り
必要があればインストールしてください！

```
pip install opencv-python # OpenCVの機能を使用するときに必要(python上ではcv2で使う)
pip install os            # osに依存している機能を利用できる
```

### ディレクトリ構造
ディレクトリ構造は下記の通り

```
-- rgb.py
   -- rgb.py
   -- img
      -- fruit.jpg
```

写真はおいしそうな果物たちを使用してみます
![fruit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/687d55f0-8346-d7d4-2811-9aac8e392426.jpeg)

# RGB加工
OpenCVを使用することにより、 **三原色（赤，緑，青）の数値** を取得することができる
せっかくなので、画像ファイル名を取得し、その画像を加工するプログラムにしてみた

### プログラム
```python:rgb.py
import cv2
import os

# 画像があるフォルダ取得
PATH = './img'
FOLDER = os.listdir(PATH)

# ウィンドウ名の設定
OLD_WINDOW_NAME = 'old'
NEW_WINDOW_NAME = 'new'

# bgr COLORS
COLORS = ['blue', 'green', 'red']

# 画像ファイル名取得
def get_file_name():
    print('*** All  Pictures ***')
    print(*FOLDER, sep='\n')
    print('***      End      ***')

    while True:
        file_name = input('使用するファイル名は何ですか？: ')
        if file_name in FOLDER:
            return file_name
        else:
            print('{}というファイルは存在しません。'.format(file_name))

# 色を使用するかどうか確認
def yes_no_color(color):
    while True:
        choice = input('{}を使用しますか？[y/N]: '.format(color)).lower()
        if choice == '':
            pass
        elif choice in 'yes':
            return True
        elif choice in 'no':
            return False

# メイン
if __name__ == '__main__':
    old_file_name = get_file_name()
    file_prefixes = old_file_name.rsplit('.', 1)
    new_file_name = file_prefixes[0]

    # 元の画像ファイルを読み込む
    old_img = cv2.imread(PATH + '/'+ old_file_name, cv2.IMREAD_COLOR)

    # ゼロ埋めの画像配列
    if len(old_img.shape) == 3:
        height, width, channels = old_img.shape[:3]
    else:
        height, width = old_img.shape[:2]
        channels = 1
    
    # 0に初期化
    zeros = np.zeros((height, width), old_img.dtype)

    # RGB分離
    img_colors = cv2.split(old_img)

    # 青，緑，赤の順で色を使用するか確認
    for color in COLORS:
        if yes_no_color(color):
            new_file_name += '_' + color[:1]
        else:
            # 使用しない色は0に初期化
            img_colors[COLORS.index(color)] = zeros

    new_file_name += '.' + file_prefixes[1]

    # 新しい画像ファイルに色を付ける
    new_img = cv2.merge((img_colors[0], img_colors[1], img_colors[2]))

    # ウィンドウを作成
    cv2.namedWindow(OLD_WINDOW_NAME)
    cv2.namedWindow(NEW_WINDOW_NAME)

    # ウィンドウに表示
    cv2.imshow(OLD_WINDOW_NAME, old_img)
    cv2.imshow(NEW_WINDOW_NAME, new_img)

    # ファイルに保存
    cv2.imwrite(r'img/{}'.format(new_file_name), new_img)

    # 終了処理
    cv2.waitKey(0)
    cv2.destroyAllWindows()
```

画像を読み込むとき **BGR(青，緑，赤)** の順番で取得することに注意

### 少し解説
> old_img = cv2.imread(PATH + '/'+ old_file_name, cv2.IMREAD_COLOR)

ここで画像データを読み込む
**cv2.IMREAD_COLOR** の部分で三原色を取得している
他にもグレイスケールで読み込みもできる

> img_colors[COLORS.index(color)] = zeros

指定されなかった色は、ここで0に初期化される。

> cv2.waitKey(0)

何かしらキーボード入力があるまで、プログラムを一時停止する。

> cv2.destroyAllWindows()

作成されたウィンドウを閉じる関数
特定のウィンドウのみ削除したい場合、()内にウィンドウ名を入力する。

### 出力結果

コマンドライン
![gazou.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/f34c8753-d3dd-bdd5-c5e1-6f3782e96d4b.png)

青
![fruit_b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/4b0248ec-407b-c77b-9d2e-1eb42a57aef2.jpeg)
緑
![fruit_g.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/cca7f2cc-9d67-f802-261d-2e0aa69a0a7d.jpeg)
赤
![fruit_r.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/835c534b-1ca9-5745-2690-090de62b9984.jpeg)
赤＋青
![fruit_b_r.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/5c6dbcd0-442f-9749-62a8-61cb7c8b8c4e.jpeg)

うん。。。どれも食欲が湧かない(笑)
※処理を終了したい場合は、どちらかの画像ウィンドウをクリックして、何かキーボード入力をすれば処理が終了します。

# まとめ
パート１では、OpenCVについてとrgb加工を重点にまとめてみた
赤，緑，青の写真を見比べると、この写真はどの色が強いかなどがわかった
次回パート２ではグレイスケール加工や反転などをまとめていきたい( ˘ω˘ )