前提・実現したいこと
画像一枚中の様々な場所から、画像のトリミングをしたい
発生している問題・エラーメッセージ
下記のコードの用に入力するとうまく画像を切り抜くことができるのですが、
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です。
切り抜きたいサイズは448448です。
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー