Python独習!

習得したPython知識をペイフォワード

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()


/* -----codeの行番号----- */