はじめに
画像認識をする機械学習のモデルを自分で作ってみようと思い、その下準備として学習する画像を加工するスクリプトを書きました。
実施する内容は以下
・画像をグレースケールにして色の特徴を消す。
・画像上の画像認識に使用しない領域にマスク処理をする。
準備するもの
・マスクしたい箇所を黒で塗りつぶした画像(mask_file.jpg)
やったこと
「C:\XXXXXX\XXXXXX\」の下に加工したい画像を置いて、スクリプトを実行すると、
「C:\YYYYYY\YYYYYY\」の下に加工後のファイルを出力します。
マスクファイルは「C:\ZZZZZZ\ZZZZZZ\mask_file.jpg」に置きます。
パスは実行する環境に合わせて記載してください。
import cv2
import glob
input_dir = "C:\\XXXXXX\\XXXXXX\\*"
output_dir = "C:\\YYYYYY\\YYYYYY\\"
maskfile = "C:\\ZZZZZZ\\ZZZZZZ\\mask_file.jpg"
#ファイル名を取得
for path in glob.iglob(input_dir, recursive=True):
try:
img = cv2.imread(path)
#グレースケール処理
img_1 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#マスク処理
maskimg = cv2.imread(maskfile)
maskimg = cv2.cvtColor(maskimg, cv2.COLOR_RGB2GRAY)
maskimg = cv2.resize(maskimg, img_1.shape[1::-1])
img_2 = cv2.bitwise_and(img_1, maskimg)
#加工後のファイルを保存
output_path = output_dir + "mask_" + path.split("\\")[-1]
cv2.imwrite(output_path, img_2)
print(output_path + " Finish!")
except Exception as e:
print("error! " + str(e))
このように画像を加工して出力されます。
つまづいた所1
ファイルのパスを指定する際に日本語のファイルパスだとOpenCVでこんなエラーが出ます。
ファイルパスは英語にする必要があります。
error!
OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-sn_xpupm\opencv\modules\imgproc\src\
color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
つまづいた所2
マスク画像をそのまま使おうとしたら配列のサイズが違ことでエラーになりました。
error!
OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-sn_xpupm\opencv\modules\core\src\
arithm.cpp:214: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and type),
nor 'array op scalar', nor 'scalar op array' in function 'cv::binary_op'
白黒の画像をグレーアウト処理を追加することで解決しました。
maskimg = cv2.cvtColor(maskimg, cv2.COLOR_RGB2GRAY)