やりたいこと
①プログラム実行時に引数をファルダ名にする、もしくはプログラム内でフォルダを指定
②ファルダ内すべてのpngファイルにプログラムを実行
下のコードはグレースケールで画像を読み込んで、ハミング距離を出力するプログラムです。
このプログラムの実行は
入力:$python test.py 出力:[0 1 0 1 0 . . . 0] ・ ・ ・ ハミング距離:7159 ハミング距離:19430
となります。
これをフォルダの引数をとって、
入力: python test.py fold1 fold2 fold3
で実行できるようにしたいです。
もしくはプログラム内でフォルダを指定して、ファルダ内のファイルすべてにプログラムを実行したいです。
ファイルの引数、ファイル取得の関数はできたのですが、#11をどのように書きかえればいいのか分かりません。引数で指定したフォルダ内のファイルを1つ1つループで読み込み、ハミング距離を出力したいです。
どなたか詳しい方、ご助力お願いいたします。
#11---関数の呼び出し ahash = average_hash('test1_2D_out/000002_OUT.png') ahash1 = average_hash('test1_2D_out/000003_OUT.png') ahash2 = average_hash('test1_mask_bara/2D/Target/000002.png') hamming_ab,hamming_ac = hamming_dist(ahash,ahash1,ahash2)
test.py
python
1from PIL import Image 2import numpy as np 3import os, re 4import argparse 5import sys 6import pathlib 7 8def get_filenames_of_path(path: pathlib.Path, ext: str = "*"): 9 """Returns a list of files in a directory/path. Uses pathlib.""" 10 filenames = [file for file in path.glob(ext) if file.is_file()] 11 filenames.sort() 12 return filenames 13 14def get_args(): 15 parser = argparse.ArgumentParser(description='Evaluate result', 16 formatter_class=argparse.ArgumentDefaultsHelpFormatter) 17 parser.add_argument('target_dir', type=str) 18 parser.add_argument('result_dir', type=str) 19 20 return parser.parse_args() 21args = get_args() 22 23result_dir = pathlib.Path.cwd() / args.result_dir 24target_dir = pathlib.Path.cwd() / args.target_dir 25 26#1---Average Hashの取得 27def average_hash(fname, size = 256): 28#2---画像データを開く 29 img_data = Image.open(fname) 30#3---グレースケールに変換 31 img_data = img_data.convert('L') 32#4---リサイズ 33 img_data = img_data.resize((size, size), Image.ANTIALIAS) 34#5---ピクセルデータを得る 35 pixel_data = img_data.getdata() 36#6---Numpyに変換 37 pixels = np.array(pixel_data) 38#7---二次元の配列に変換 39 pixels = pixels.reshape((size, size)) 40#8---平均算出 41 average = pixels.mean() 42#9---値を1と0に変換 43 out_pix = 1 * (pixels > average) 44 return out_pix 45#10---ハミング距離の算出 46def hamming_dist(a, b, c): 47 aa = a.reshape(1, -1) 48 ab = b.reshape(1, -1) 49 ac = c.reshape(1,-1) 50 dist = (aa != ab).sum() 51 dist1 = (aa != ac).sum() 52 return dist,dist1 53#11---関数の呼び出し 54ahash = average_hash('test4_out_bara/a/02/00353_00354_01.png') 55ahash1 = average_hash('test4_out_bara/a/02/00353_00354_01.png') 56ahash2 = average_hash('test4_mask_bara/02/Target/out48_02.png') 57hamming_ab,hamming_ac = hamming_dist(ahash,ahash1,ahash2) 58 59#12---出力結果 60print(ahash) 61print("*****") 62print(ahash1) 63print("*****") 64print(ahash2) 65print("ハミング距離は",hamming_ab) 66print("ハミング距離は",hamming_ac)
こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。
回答2件