2
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-10-17

はじめに

Pythonを使って、画像やWebカメラを加工してみた パート2

前回に引き続き、 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

グレイスケール,ネガポジ反転

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

グレイスケール

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

ネガポジ反転

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

プログラム

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

ネガポジ反転
fruit_negaposi.jpg

グレイスケール
fruit_gray.jpg

画像回転,軸回転

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

プログラム

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

画像回転
fruit_rotation.jpg

軸回転
fruit_inversion.jpg

まとめ

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1