pythonでopencvを使ったフィルターを複数ファイルに一括処理することが多いのでバッチスクリプトを作成してみました。
#!/usr/bin/env python3
# coding: utf8
import cv2
import numpy as np
import os, glob
#
# Pythonでフォルダ内画像を一括でフィルタ処理するスクリプト
#
# フィルター
def filter(src_file, dst_dir):
basename = os.path.splitext(os.path.basename(src_file))[0] # ファイル名を取得
print(basename)
# 画像ファイル読み込み
img = cv2.imread(src_file)
# グレースケールに変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# カーネルの定義(アンシャープマスキングフィルタ)
k = 1.5
kernel = np.array([[-k/9,-k/9,-k/9],[-k/9,1+8*k/9,-k/9],[-k/9,-k/9,-k/9],])
# 出力オブジェクト
dst = gray.copy()
d = 1 # フィルター処理が出来ない上下左右の領域(カーネルの幅-1/2)
h, w = gray.shape[:2]
# 畳み込み
for y in range(d, h - d):
for x in range(d, w - d):
dst[y][x] = np.sum(gray[y-d:y+d+1, x-d:x+d+1] * kernel)
# png形式で保存
dst_file = os.path.join(dst_dir, (basename+".png"))
cv2.imwrite(dst_file, dst)
if __name__ == '__main__':
src_dir = 'C:/Users/PC01114/Pictures' # 加工元画像の保存場所(ディレクトリ)
dst_dir = './out/' # 加工先画像の保存場所(ディレクトリ)
file_filter = '*.jpg' # 画像ファイル名のフィルタ
if not os.path.exists(dst_dir): # 加工先ディレクトリの作成
os.mkdir(dst_dir)
for src_file in glob.glob(os.path.join(src_dir, file_filter)): # 一括処理ループ
filter(src_file, dst_dir)
フィルターの内容は画像ファイルを読み込みグレースケールに変換、アンシャープマスキングフィルタを施す流れになっています。動作はしますが遅いので実用的では無いですが、フィルター部分を変更することで色々な場面に対応できると思ます。
コメント