質問するログイン新規登録
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

Q&A

1回答

164閲覧

画像の中のエッジの端の検出

zerez

総合スコア0

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

0グッド

1クリップ

投稿2025/09/29 01:15

編集2025/09/29 03:47

0

1

※同じ質問を
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関数によって線を太くしています.
個人的に調べてはいるものの,どれもエッジの検出までしか行っていませんでした.
なにかアルゴリズム・アイデア等があれば教えていただきたいです.

補足

特になし

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

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

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

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

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

guest

回答1

0

中心に一番近いエッジの端

というのが

(1) 中心に一番近い「エッジの端」
(2) 「中心に一番近いエッジ」の端

のどちらなのか? 次第でやることが変わり得る気もします.

( dilate は「見やすくする」という可視化目的でしょうから,実処理には含めないとして)Canny の結果から出発することを考えるなら,各エッジ点に関して連結数(隣にエッジ点がいくつあるのか)を調べることを考えてみてはどうでしょうか.
話が上記(1)側であれば,うまくいけばそれで済むかもしれません.
話が上記(2)側であれば,先にラベリング的な処理が必要かもしれません.

  • OpenCV に連結数を得る関数があるのかは知りませんが,無くても自前で画像走査すれば良いかと.
  • ラベリングについては「OpenCV ラベリング」とかでググると一応は関数の候補は見つかると思います.(ただこっちも,使いにくそうなら自前で組むという選択肢もあり得るかな?)

投稿2025/09/29 02:08

編集2025/09/29 02:10
fana

総合スコア12289

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問