1
2

More than 3 years have passed since last update.

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

Posted at

はじめに

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

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

お品書きは下記の通り

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

OpenCVとは

OpenCV

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

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

モジュール

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

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

ディレクトリ構造

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

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

写真はおいしそうな果物たちを使用してみます
fruit.jpg

RGB加工

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

プログラム

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


fruit_b.jpg

fruit_g.jpg

fruit_r.jpg
赤+青
fruit_b_r.jpg

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

まとめ

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

1
2
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
1
2