画像の中のエッジの端の検出
※同じ質問を
teratail
stackoverflow
にもしております.
解決したいこと
以下のような画像があります.この画像の中心に一番近いエッジの端を検出したいです.
以下のような赤丸付近の座標を知りたいということです.(誤差は上下左右5ピクセル以内に抑えたいです.)
発生している問題・エラー
エッジを検出した後の処理.もしくはエッジを検出せずに行う方法.
該当するソースコード
import os
import cv2
import glob
import numpy as np
from PIL import Image
def load_bmp(bmp_file):
return np.array(Image.open(bmp_file).convert("L")).astype(np.float32)
def save_bmp(matrix, bmp_dir, bmp_name=""):
uint8_bmp = Image.fromarray(matrix.astype(np.uint8))
uint8_bmp.save(os.path.join(bmp_dir, bmp_name + ".bmp"))
def save_nor_bmp(matrix, bmp_dir, bmp_name=""):
nor_bmp = cv2.normalize(matrix, None, 0, 255, cv2.NORM_MINMAX)
uint8_bmp = Image.fromarray(nor_bmp.astype(np.uint8))
uint8_bmp.save(os.path.join(bmp_dir, bmp_name + ".bmp"))
cd = os.path.dirname(os.path.abspath(__file__))
bmp_dir = os.path.join(cd, "bmp")
bmp_files = glob.glob(os.path.join(bmp_dir, "*.bmp"))
edge_dir = os.path.join(cd, "edge")
itera = 0
for bmp_file in bmp_files:
bmp = load_bmp(bmp_file)
uint8_bmp = np.uint8(bmp)
edges = cv2.Canny(uint8_bmp, 900, 1000)
nor_edges = cv2.normalize(edges, None, 0, 1, cv2.NORM_MINMAX)
kernel = np.ones((3, 3), np.uint8)
dilated_edges = cv2.dilate(nor_edges.astype(np.uint8), kernel, iterations=1)
save_nor_bmp(dilated_edges, edge_dir, "edge_image"+str(itera+1))
itera += 1
自分で試したこと
現在はopenCVのCanny関数によりエッジを検出し,その後見やすくするために同じくopenCVのdilate関数によって線を太くしています.
個人的に調べてはいるものの,どれもエッジの検出までしか行っていませんでした.
なにかアルゴリズム・アイデア等があれば教えていただきたいです.
0 likes