このスクリプトは基本グレースケールで一部赤色でコメントが書き込まれている画像があり、その画像を完全なグレースケールにする必要があり作成しました。出力される画像のコメント部分は不要でしたので白色に置き換えています。
処理対象の画像ファイルは24bitのRGBですが、内容がグレースケールでRGBの各チャンネルに同じ色がセットされてることを想定します。そのような場合RGBのいずれかのチャンネルを分離することで8bitのグレースケールにすることが出来ます。
ただし、各チャンネルの値が異なる場合は白色(255)をセットするようにしています。
#!/usr/bin/env python3
#
# RGB形式の画像をグレースケールに変換
#
import os
import glob
import shutil
import cv2
import numpy as np
# 入力ディレクトリ
in_dir = "./resrgan_dataset_dl"
# 出力先のディレクトリ
out_dir = "./resrgan_dataset_gray"
if not(os.path.exists(out_dir)):
os.mkdir(out_dir)
if __name__ == '__main__':
for src_file in glob.glob((in_dir+'/*.jpg')):
img = cv2.imread(src_file)
if(len(img.shape) == 2):
gray = img.copy()
else:
img_b = img[:, :, 0].copy()
img_g = img[:, :, 1].copy()
img_r = img[:, :, 2].copy()
# グレースケールでない場合255(白色)をセット
gray = np.where(img_b == img_g, np.where(img_b == img_r, img_b, np.uint8(255)), np.uint8(255))
basename = os.path.splitext(os.path.basename(src_file))[0]
dst_file = os.path.join(out_dir, (basename+".png"))
cv2.imwrite(dst_file, gray)
通常カラーをクレースケールにする場合、OpenCVのcv2.cvtColor()関数をcv2.COLOR_BGR2GRAYオプションで変換するところですが、処理する画像が概ねグレースケールですので、このようなコードにしてみました。
以上
コメント