質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

526閲覧

ファルダ名を引数にして、ファルダ内のすべてのファイルにプログラムを実行させるように修正したい

tiroha

総合スコア109

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/01/21 02:21

編集2022/01/21 06:22

やりたいこと
①プログラム実行時に引数をファルダ名にする、もしくはプログラム内でフォルダを指定
②ファルダ内すべての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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2022/01/21 04:42

質問は何ですか? sys.argvを使えばできますので、検索したり書籍を読んだりして試してみればよいと思います。試してみて、できなければそのつまづいたところについて質問しましょう。
tiroha

2022/01/21 04:49

回答ありがとうございます。 質問を修正しました。調べたら、sys.argvを使えばできる気がするのですが、使い方がよく分からなくて。。
guest

回答2

0

公式ドキュメント argparse --- コマンドラインオプション、引数、サブコマンドのパーサー
Pythonでコマンドライン引数を扱う方法(sys.argv, argparse)
を読んで、まずできるところまでご自身でやってください。

その上でわからないところがあるなら改めて質問してください。

投稿2022/01/21 10:19

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sys.argv 使い方 - Google 検索

まずはこれをどうぞ。
これを読んでわからない所があれば、そのページを提示して聞いてください


  1. 引数のディレクトリからファイルのリストを取得
  2. ファイルリストからパスを取ってきて処理
  3. リストからファイルが尽きるまでループ
  4. おしまい

という手順になると思われますが、これのどれがわからないんでしょうか

投稿2022/01/21 05:19

編集2022/01/21 06:34
y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiroha

2022/01/21 05:51

回答ありがとうございます。 質問したプログラムに追加しました。 ディレクトリの引数とファイル取得の関数は作成したのですが、#11をどのように書きかえればいいのか分かりません。
y_waiwai

2022/01/21 06:05

それをどうしたいのかを書かないとだれも答えれませんよ
tiroha

2022/01/21 06:23

質問を修正しました。
y_waiwai

2022/01/21 06:34

追記しました
tiroha

2022/01/21 06:47

回答ありがとうございます。 手順をプログラムに落とし込むのに苦労しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問