※同じ質問を
stackoverflow
Qiita
にもしております.
実現したいこと
以下のような画像があります.この画像の中心に一番近いエッジの端を検出したいです.
以下のような赤丸付近の座標を知りたいということです.(誤差は上下左右5ピクセル以内に抑えたいです.)
発生している問題・分からないこと
エッジを検出した後の処理.もしくはその前段階の処理.
該当のソースコード
Python
1import os 2import cv2 3import glob 4import numpy as np 5from PIL import Image 6 7def load_bmp(bmp_file): 8 return np.array(Image.open(bmp_file).convert("L")).astype(np.float32) 9 10def save_bmp(matrix, bmp_dir, bmp_name=""): 11 uint8_bmp = Image.fromarray(matrix.astype(np.uint8)) 12 uint8_bmp.save(os.path.join(bmp_dir, bmp_name + ".bmp")) 13 14def save_nor_bmp(matrix, bmp_dir, bmp_name=""): 15 nor_bmp = cv2.normalize(matrix, None, 0, 255, cv2.NORM_MINMAX) 16 uint8_bmp = Image.fromarray(nor_bmp.astype(np.uint8)) 17 uint8_bmp.save(os.path.join(bmp_dir, bmp_name + ".bmp")) 18 19cd = os.path.dirname(os.path.abspath(__file__)) 20bmp_dir = os.path.join(cd, "bmp") 21bmp_files = glob.glob(os.path.join(bmp_dir, "*.bmp")) 22edge_dir = os.path.join(cd, "edge") 23 24itera = 0 25for bmp_file in bmp_files: 26 bmp = load_bmp(bmp_file) 27 uint8_bmp = np.uint8(bmp) 28 29 edges = cv2.Canny(uint8_bmp, 900, 1000) 30 nor_edges = cv2.normalize(edges, None, 0, 1, cv2.NORM_MINMAX) 31 kernel = np.ones((3, 3), np.uint8) 32 dilated_edges = cv2.dilate(nor_edges.astype(np.uint8), kernel, iterations=1) 33 34 save_nor_bmp(dilated_edges, edge_dir, "edge_image"+str(itera+1)) 35 36 itera += 1
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
現在はopenCVのCanny関数によりエッジを検出し,その後見やすくするために同じくopenCVのdilate関数によって線を太くしています.
個人的に調べてはいるものの,どれもエッジの検出までしか行っていませんでした.
なにかアルゴリズム・アイデア等があれば教えていただきたいです.
補足
特になし
