Pythonで自動化!複数画像から輝度値を取得してテキストに出力する
- 画像から輝度値を抽出したいが、大量にあるので自動化したい。
filedialog.askopenfilenames
を使ってファイルダイアログで複数画像を一括で選択できるようにする。
解説
filedialog.askopenfilenamesの使い方
filetypes
で開くファイルの種類を指定、initialdir
でデフォルトパスを指定するだけ。ちなみに...namesのsを抜くとファイルが1個しか選択できない。複数選択したい場合はsを忘れないこと。files
はタプル型になり、選択したファイルのパスが格納される。なので、このタプルをfor文でアンパックしてあげれば一括処理ができる。
files = filedialog.askopenfilenames(filetypes = ***, initialdir = ***)
サンプルプログラム
デスクトップに保存されている赤、青、緑の3枚の画像から一括で輝度値を取得してテキストに出力するプログラムを作成した。
- 下の画像はファイルダイアログで画像を選択するところ。
- 下の画像は出力結果。※見やすいように後から編集で適当にスペースを入れてある。
ソースコード
# 35_GetIntensity_001.py # python 3.8.1 # opencv-python 4.1.2.30 # coding: utf-8 import os import datetime import cv2 import tkinter as tk from tkinter import filedialog def getBGR(path): imgBGR = cv2.imread(path, cv2.IMREAD_COLOR) #開いた画像からRGBを抽出する。 b = imgBGR.T[0].flatten().mean() g = imgBGR.T[1].flatten().mean() r = imgBGR.T[2].flatten().mean() return b, g, r def main(): root = tk.Tk() root.withdraw() #出力するファイルの名前を定義する。タイムスタンプ付き。 now = datetime.datetime.now() fo = 'ImageIntensityList_{:%Y%m%d%H%M%S}.txt'.format(now) #ファイルダイアログのデフォルトパスをデスクトップにする。 desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop" #対象ファイルのタイプをTiffに限定する。 target_format = [('TIF image', '*.tif')] #ファイルダイアログオブジェクトの作成。複数ファイル選択できる。 files = filedialog.askopenfilenames(filetypes = target_format, initialdir = desktop_path) #ファイルダイアログで選択したすべてのファイルを処理する。 with open(os.path.join(desktop_path, fo), mode='a') as f: f.write('File path,B,G,R,Intensity\n') for file in files: b, g, r = getBGR(file) i = 0.298912 * r + 0.586611 * g + 0.114478 * b #RGBから輝度値を算出 line = '{0},{1:.2f},{2:.2f},{3:.2f},{4:.2f}\n'.format(file, b, g, r, i) f.write(line) if __name__ == '__main__': main()