前提・実現したいこと
こちらの質問を参考に、画像の輪郭を抽出させ、それぞれの面積を表示させるコードを書きました。
そのコードに、「面積が100以上で白色(RGB(230,230,230以上)の場合、指定した色(RGB(16,16,16)で塗りつぶす」というコードを追記したですが、面積が100以上の部分以外も、白色(RGB(230,230,230以上)の部分は全て塗りつぶされてしまいます。https://teratail.com/questions/169498
お手数ですがコードの修正方法についてアドバイスをいただけますととても助かります。
どうぞよろしくお願いいたします。
該当のソースコード
Python
1import glob 2import os 3from PIL import Image 4import cv2 5import matplotlib.pyplot as plt 6from google.colab.patches import cv2_imshow 7 8 9input_dir = 'NORMAL_resize_copy_100_1_0506' # 画像があるディレクトリ 10output_dir = 'NORMAL_resize_pixel_100_1_0506' # 出力するディレクトリ 11 12os.makedirs(output_dir, exist_ok=True) # 保存するディレクトリ 13 14assert(os.path.exists(input_dir)), "directory '{}' not found".format(input_dir) 15for path in glob.glob(input_dir + "/*.jpeg"): 16 img = cv2.imread(path,0) 17 for i, cnt in enumerate(contours): 18 cnt = np.squeeze(cnt, axis=1) # (NumPoints, 1, 2) -> (NumPoints, 2) 19 # 輪郭の点同士を結ぶ線を描画する。 20 ax.add_patch(Polygon(cnt, color='b', fill=None, lw=2)) 21 # 輪郭の点を描画する。 22 ax.plot(cnt[:, 0], cnt[:, 1], 'ro', mew=0, ms=4) 23 # 輪郭の番号を描画する。 24 ax.text(cnt[0][0], cnt[0][1], i, color='orange', size='20') 25 area = cv2.contourArea(cnt) 26 print('contour: {}, area: {}'.format(i, area)) 27 #白色の面積が100以上かつRGBが(230,230,230以上)の場合、RGB(16,16,16)で塗りつぶす 28 if area > 100: 29 img[img >= 230] = 16 30 #plt.show() 31 name, ext = os.path.splitext(os.path.basename(path)) # 拡張子を除いたファイル名 32 save_path = os.path.join(output_dir, '{}_pixel.jpeg'.format(name)) # 保存するパス 33 cv2.imwrite(save_path, img) 34 35fig, ax = plt.subplots(figsize=(6, 6)) 36draw_contours(ax, img, contours) 37plt.show()
回答2件
あなたの回答
tips
プレビュー