はじめに
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
グレイスケール,ネガポジ反転
前回作成したプログラムを基本形として、グレイスケールとネガポジ反転を行なう
グレイスケール
白黒写真のようなイメージ
画像処理を行なう上で計算をしやすくするために使用される
ネガポジ反転
ネガフィルム(ネガ,陰画)を反転すると普通の写真(ポジ,陽画)になる
そのことからネガポジ反転と呼ばれているとのこと
プログラム
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)
ネガポジ反転を行なう場所
出力結果
画像回転,軸回転
画像回転および軸反転を行なう
プログラム
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軸
出力結果
まとめ
パート2では、OpenCVの関数を用いて色変換や回転などをやってみた
関数一つで画像加工ができるので非常に便利である。
次回、パート3ではモザイク処理をやってみようと思う( ˘ω˘ )