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

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

新規登録して質問してみよう
ただいま回答率
85.35%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

0回答

594閲覧

画像の切り取りがうまくできない

Sukenosuke0221

総合スコア10

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

1グッド

1クリップ

投稿2021/05/14 05:39

前提・実現したいこと

画像一枚中の様々な場所から、画像のトリミングをしたい

発生している問題・エラーメッセージ

下記のコードの用に入力するとうまく画像を切り抜くことができるのですが、

width=448 ymax=1280 xmax=960 #中央 if number == 0: img_trim = img[ymax//2-width//2: ymax//2+width//2, xmax//2-width//2: xmax//2+width//2] #左上 elif number == 1: img_trim = img[0:width, 0:width] #右上 elif number == 2: img_trim = img[0:width, xmax-width:xmax] #左下 elif number == 3: img_trim = img[ymax-wob-width:ymax-wob, 0:width] #右下 elif number == 4: img_trim = img[ymax-wob-width:ymax-wob, xmax-width:xmax]

以下のように淵以外の場所を切り取りしようろするとすると、実行できなくなります。
この原因は何なのでしょうか。教えてください。
一応ほかの計算に使う関数も記載しております。関数部分は上記の実行できるものとなんら変更しておりません。
また、元画像サイズは縦960幅1280です。
切り抜きたいサイズは448
448です。
wobは画像の下に黒い淵があるのでそれを考慮したためです。
wob=64です。

該当のソースコード

#(width*width)の正方形に切り出す def trim(img, width, number, bar_switch,slide): ymax = img.shape[0] xmax = img.shape[1] if bar_switch == 'FE-SEM': # FE-SEM #width_of_bar wob = 64 elif bar_switch == 'W-SEM': # W-SEM wob = 0 else: pass #中央 if number == 0: img_trim = img[ymax//2-width//2: ymax//2+width//2, xmax//2-width//2: xmax//2+width//2] #上1 elif number == 1: img_trim = img[0:width, 0:width] #上2 elif number == 2: img_trim = img[0:width, width:width+width] #上3 elif number ==3: img_trim = img[0:width, xmax-width:xmax] #下1 elif number ==4: img_trim = img[ymax-wob-width:ymax-wob, 0:width] #下2 elif number ==5: img_trim = img[ymax-wob-width:ymax-wob, width:width+width] #下3 elif number == 6: img_trim = img[ymax-wob-width:ymax-wob, xmax-width:xmax] #中央1 elif number == 7: img_trim = img[slide:width+slide, 0:width] #中央2 elif number == 8: img_trim = img[slide:width+slide, width:width+width] #中央3 elif number == 9: img_trim = img[slide:width+slide, xmax-width:xmax] #中央4 elif number == 10: img_trim = img[ymax-wob-width-slide:ymax-wob-slide, 0:width] #中央5 elif number == 11: img_trim = img[ymax-wob-width-slide:ymax-wob-slide, width:width+width] #中央6 elif number == 12: img_trim = img[ymax-wob-width-slide:ymax-wob-slide, xmax-width:xmax] #中央7 elif number == 13: img_trim = img[0:width, slide:width+slide] #中央8 elif number == 14: img_trim = img[0:width, width+slide:width+width+slide] #中央9 elif number == 15: img_trim = img[0:width, xmax-width-slide:xmax-slide] #中央10 elif number == 16: img_trim = img[ymax-wob-width:ymax-wob, slide:width+slide] #中央11 elif number == 17: img_trim = img[ymax-wob-width:ymax-wob, width+slide:width+width+slide] #中央12 elif number == 18: img_trim = img[ymax-wob-width:ymax-wob, xmax-width-slide:xmax-slide] #中央13 elif number == 19: img_trim = img[300:width+300, 0:width] return img_trim #(nosp*nosp)の枚数に画像を分割する def trim2(img,ny,nx,ny1,nx1): ymax = img.shape[0] xmax = img.shape[1] img_trim = img[(ny1-1)*(ymax//ny):ny1*(ymax//ny),(nx1-1)*(xmax//nx):nx1*(xmax//nx)] return img_trim def RGB_clahe_trans(img): # RGB --> YUV img0_YUV = cv2.cvtColor(img, cv2.COLOR_RGB2YUV) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) img0_YUV[:,:,0] = clahe.apply(img0_YUV[:,:,0]) # YUV --> RGB img_clahe = cv2.cvtColor(img0_YUV, cv2.COLOR_YUV2RGB) return img_clahe # Train, Validationデータを生成する関数. def generate_train_val(img, SEM_select, clahe_select, path_tr_val, label_tr_val,slide): for i_tv in range(4): img = trim(img, 448, i_tv, SEM_select,slide) for j_tv in range(2): for k_tv in range(2): img_trim2 = trim2(img, 2, 2, j_tv+1, k_tv+1) # 適用的ヒストグラム平坦化 CLAHE if clahe_select == 'no': pass elif clahe_select == 'clahe': # clahe ( 関数内でRGB --> YCbCr --> Yに対してclahe --> YCbCr --> RGB ) img_trim2 = RGB_clahe_trans(img_trim2) else: pass # 回転させる. set_angle = [0, 90, 180, 270] for l_tv in range(len(set_angle)): if set_angle[l_tv] == 0: img_Rot = img_trim2 else: #画像回転 trans = cv2.getRotationMatrix2D((int(img_trim2.shape[1]//2), int(img_trim2.shape[0]//2)), set_angle[l_tv], scale=1.0) img_Rot = cv2.warpAffine(img_trim2, trans, (img_trim2.shape[1], img_trim2.shape[0])) # 保存用のパス生成. original_file_name = path_tr_val.rsplit('/', 1)[1] #print(original_file_name) original_file_name = original_file_name.rsplit('.', 1)[0] #print(original_file_name) save_path = "./Databox_ver2/Train/"+str(label_tr_val)+"/"+str(original_file_name)+"."+str(i_tv+1)+"."+str(j_tv+1)+"."+str(k_tv+1)+"."+str(set_angle[l_tv])+".tif" #print(save_path) if save_images == "save": # 画像保存 cv2.imwrite(save_path, img_Rot) else: pass ### メイン関数 ################################################################### def main(): # 1_set_preprocess.csv から指示を読み出し. SEM_select, clahe_select, mean_select = set_preprocess("./1_set_preprocess.csv") # 1_preprocess.csv を読み取り, データをTrain(Train, Validation)とTestに分ける. train_val_path, test_path = preprocess("./1_preprocess.csv") # フォルダ名にするため, labelを取得する. labels = np.unique(train_val_path.loc[:, 'label']) num_label = labels.shape[0] # 生成した画像を保存するためのフォルダを用意する. make_savedir(labels, num_label) slide=100 # Train, Validationデータを1枚ずつ処理する. for i_tr_val in range(train_val_path.shape[0]): #for i_tr_val in range(1): path_tr_val = train_val_path.loc[i_tr_val, 'Dir'] label_tr_val = train_val_path.loc[i_tr_val, 'label'] print(path_tr_val, "is processing.") # 画像読み込み. img = cv2.imread(path_tr_val, 1) # TrainとValidationデータの生成関数へ. generate_train_val(img, SEM_select, clahe_select, path_tr_val, label_tr_val,slide)

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

DrqYuto👍を押しています

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

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

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

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

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

mokemokechicken

2021/06/05 07:47

> 以下のように淵以外の場所を切り取りしようろするとすると、実行できなくなります。 「実行できなくなる」というのはどういう症状なんでしょうか? 「エラーが発生する?」「意図しない切り抜きになる?」 エラーになるとしたら、どういうエラーが(どういう入力のときに)発生しているかを調べると良いです(そして、それを一緒に質問に書くと良いです)。 意図しない切り抜きになるとしたら、どういう切り抜きに(どういう入力のときに)なるかを調べると良いです。こういう場合は、いろいろパラメータを変えて実行すると、上手くいくときと行かないときとか傾向があったりして問題箇所がわかることもありますよ。
mokemokechicken

2021/06/05 07:52 編集

今回の件とは無関係かもしれないですが、コードを見ていて少し不安になるのは以下の部分で、 bar_switch が FE-SEM, W-SEM 以外のときに wob は未定義になるので、 例えば number=4 のときだと エラーになりますね。 bar_switch が上記2種類しかないはずで、それ以外だと処理することができないなら、 else で pass するのではなく raise ValueError("bar_switchがへんだよ!") とかしておくと、そういう変な入力のときにすぐに気がつくことができます。 ``` if bar_switch == 'FE-SEM': # FE-SEM #width_of_bar wob = 64 elif bar_switch == 'W-SEM': # W-SEM wob = 0 else: pass ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問