はじめに
Pythonを使って、画像やWebカメラを加工してみた パート1
今回は OpenCV を使って画像(映像)加工をやってみた
業務でOpenCVを使うことがあったので、家でちょこちょこ遊んでみた
お品書きは下記の通り
- OpenCVとは
- モジュール,ディレクトリ構造など
- RGB加工
OpenCVとは
OpenCV … パソコンで、画像や映像を処理するのに必要な機能が実装されているOSSライブラリ
画像や映像を加工するにはもってこいのライブラリとのこと
学習データと組み合わせることにより、顔認識などにも使用されている
モジュール,ディレクトリ構造など
モジュール
今回使用するモジュールは下記の通り
必要があればインストールしてください!
pip install opencv-python # OpenCVの機能を使用するときに必要(python上ではcv2で使う)
pip install os # osに依存している機能を利用できる
ディレクトリ構造
ディレクトリ構造は下記の通り
-- rgb.py
-- rgb.py
-- img
-- fruit.jpg
RGB加工
OpenCVを使用することにより、 三原色(赤,緑,青)の数値 を取得することができる
せっかくなので、画像ファイル名を取得し、その画像を加工するプログラムにしてみた
プログラム
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()
作成されたウィンドウを閉じる関数
特定のウィンドウのみ削除したい場合、()内にウィンドウ名を入力する。
出力結果
うん。。。どれも食欲が湧かない(笑)
※処理を終了したい場合は、どちらかの画像ウィンドウをクリックして、何かキーボード入力をすれば処理が終了します。
まとめ
パート1では、OpenCVについてとrgb加工を重点にまとめてみた
赤,緑,青の写真を見比べると、この写真はどの色が強いかなどがわかった
次回パート2ではグレイスケール加工や反転などをまとめていきたい( ˘ω˘ )