画像やWebカメラを加工してみる パート２ ～グレイスケール，回転編～

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

<a href="https://qiita.com/str32/items/b0373de25fe1f706b84d" rel="nofollow noopener" target="_blank">前回</a>に引き続き、 **OpenCV** を使って画像加工をやってみた
今回はグレイスケールや反転をしてみる

お品書きは下記の通り

* モジュール，ディレクトリ構造など
* グレイスケール，ネガポジ反転
* 画像回転，軸回転

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

### モジュール
モジュールは前回と同様のもの＋numpyを使用
必要があればインストールしてください！

```
pip install opencv-python # OpenCVの機能を使用するときに必要(python上ではcv2で使う)
pip install numpy         # 数値計算を効率的に行うための拡張モジュール
pip install os            # osに依存している機能を利用できる
```

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

```
-- rgb
   -- color_process.py # new
   -- photo_process.py # new
   -- 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)

# グレイスケール，ネガポジ反転
前回作成したプログラムを基本形として、グレイスケールとネガポジ反転を行なう

### グレイスケール
白黒写真のようなイメージ
画像処理を行なう上で計算をしやすくするために使用される

### ネガポジ反転
ネガフィルム（ネガ，陰画）を反転すると普通の写真(ポジ，陽画)になる
そのことからネガポジ反転と呼ばれているとのこと


### プログラム
```python:color_process.py
import cv2
import numpy as np
import os

PATH = "./img"
FILES = os.listdir(PATH)

OLD_WINDOW_NAME = "old"
NEW_WINDOW_NAME1 = "new_gray"
NEW_WINDOW_NAME2 = "new_negaposi"

# get file name
def get_file_name():
    print("*** All  Pictures ***")
    print(*FILES, sep="\n")
    print("***      End      ***")
    
    while True:
        file_name = input("Which use file name ?: ")
        if file_name in FILES:
            return file_name
        else:
            print("not exist: " + file_name)

if __name__ == "__main__":
    
    old_file_name = get_file_name()
    file_prefixes = old_file_name.rsplit('.', 1)
    new_file_name1 = file_prefixes[0] + "_gray." + file_prefixes[1]
    new_file_name2 = file_prefixes[0] + "_negaposi." + file_prefixes[1]

    # 元の画像を読み込む
    old_img = cv2.imread(PATH + "/"+ old_file_name, cv2.IMREAD_COLOR)

    # new_img1 => グレイスケール, new_img2 => ネガポジ反転
    new_img1 = cv2.cvtColor(old_img, cv2.COLOR_BGR2GRAY)
    new_img2 = cv2.bitwise_not(old_img)

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

    # ウィンドウに表示
    cv2.imshow(OLD_WINDOW_NAME, old_img)
    cv2.imshow(NEW_WINDOW_NAME1, new_img1)
    cv2.imshow(NEW_WINDOW_NAME2, new_img2)

    # ファイルに保存
    cv2.imwrite(r'img/{}'.format(new_file_name1), new_img1)
    cv2.imwrite(r'img/{}'.format(new_file_name2), new_img2)

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

### 少し解説
> new_img1 = cv2.cvtColor(old_img, cv2.COLOR_BGR2GRAY)

BGRをGRAY（グレイスケール）に変換する場所
"COLOR_BGR2GRAY"以外にも、"COLOR_BGR2RGB", "COLOR_BGR2HSV"などがある

> new_img2 = cv2.bitwise_not(old_img)

ネガポジ反転を行なう場所

### 出力結果

コマンドライン
![gazou1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/4a280bd8-c9a2-e8c5-8ad5-8a38bb4f99d1.png)

ネガポジ反転
![fruit_negaposi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/19d5d07f-0404-0faf-f3f1-4aa4bc505075.jpeg)

グレイスケール
![fruit_gray.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/5b62642e-81fe-cbb5-6484-f14630e27d55.jpeg)

# 画像回転，軸回転
画像回転および軸反転を行なう

### プログラム
```python:photo_process.py
import cv2
import numpy as np
import os

PATH = "./img"
FILES = os.listdir(PATH)

OLD_WINDOW_NAME = "old"
NEW_WINDOW_NAME1 = "new_rotation"
NEW_WINDOW_NAME2 = "new_inversion"

# get file name
def get_file_name():
    print("*** All  Pictures ***")
    print(*FILES, sep="\n")
    print("***      End      ***")
    
    while True:
        file_name = input("Which use file name ?: ")
        if file_name in FILES:
            return file_name
        else:
            print("not exist: " + file_name)

if __name__ == "__main__":
    
    old_file_name = get_file_name()
    file_prefixes = old_file_name.rsplit(".", 1)
    new_file_name1 = file_prefixes[0] + "_rotation." + file_prefixes[1]
    new_file_name2 = file_prefixes[0] + "_inversion." + file_prefixes[1]

    # 元の画像を読み込む
    old_img = cv2.imread(PATH + "/"+ old_file_name, cv2.IMREAD_COLOR)

    new_img1 = cv2.rotate(olg_img, cv2.ROTATE_90_CLOCKWISE)
    new_img2 = cv2.flip(old_img, 1)

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

    # ウィンドウに表示
    cv2.imshow(OLD_WINDOW_NAME, old_img)
    cv2.imshow(NEW_WINDOW_NAME1, new_img1)
    cv2.imshow(NEW_WINDOW_NAME2, new_img2)

    # ファイルに保存
    cv2.imwrite(r"img/{}".format(new_file_name1), new_img1)
    cv2.imwrite(r"img/{}".format(new_file_name2), new_img2)

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

### 少し解説
> new_img1 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

cv2.rotateを使用して画像回転する方法
()内の変数を以下のように変更すると回転角度を変えられる

```
ROTATE_90_CLOCKWISE => 時計回りに90度
ROTATE_90_COUNTERCLOCKWISE => 反時計回りに90度
ROTATE_180 => 180度
```
 
> new_img2 = cv2.flip(old_img, 1)

flipを使用して軸回転する方法
()内の数値を以下のように変更すると回転軸も変えられる

```
0 => x軸
1 => y軸
-1 => xy軸
```

### 出力結果

コマンドライン
![gazou2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/44817bd0-5283-39ba-5413-1fe1bec6182d.png)

画像回転
![fruit_rotation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/a7f3ca33-8831-4554-e98e-9c134b4d0df8.jpeg)

軸回転
![fruit_inversion.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/ac15e3e9-7f80-5283-db9e-2da0e1ba9b43.jpeg)

# まとめ
パート２では、OpenCVの関数を用いて色変換や回転などをやってみた
関数一つで画像加工ができるので非常に便利である。
次回、パート３ではモザイク処理をやってみようと思う( ˘ω˘ )