前提
楕円の長軸と短軸の長さを求めたいです。
実現したいこと
まずは長軸から求めようと考えています。
→長軸は図形領域内で最長なので求めやすいと考えました。
今考えている方法としては、opencvのminEnclosingCircle関数で外接円を求め、その直径を楕円の長径とする方法です。
以下のコードで短径を求めることはできましたが、短径の求め方が分からないのが現状です。
どなたかご教授いただければ幸いです。
該当のソースコード
python
1import cv2 2import matplotlib.pyplot as plt 3 4img = cv2.imread("画像のパス") 5 6#二値化 7gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 8_, bin_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 9 10contours, hierarchy = cv2.findContours( 11 bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 12 13cnt = contours[0] 14 15(x, y), radius = cv2.minEnclosingCircle(cnt) 16center = (int(x), int(y)) 17radius = int(radius) 18cv2.circle(img, center, radius, (0, 0, 255), 5) 19 20print(radius*2) 21plt.imshow(img)
補足情報(FW/ツールのバージョンなど)
Google Colabratoryを使用しています。
> 楕円の長軸と短軸を求めたい
求めたいのは、長軸と短軸そのもの(位置・向き・長さ)でしょうか?
それとも、長軸と短軸の長さ(長径と短径)だけ求まればいいのでしょうか?
> 外接円を求め、その直径を楕円の長軸とする
から、長さだけ求まればいいのかな、と想像しました
説明足らずで申し訳ありません。
長軸短軸の長さを求めたいと考えています。
「求めたい楕円」の条件がわからないのでそれをきちんと定義してもらえますでしょうか
このサイトは画像も貼れるのでイメージ図を書いてみてもいいかもしれない。
また、その際、対象となる元情報は想定される中で一番複雑な形状も合わせて書いた方がいい。
>→長軸は図形領域内で最長なので求めやすいと考えました。
「図形領域内」とは?
#画像全体の領域のことなのか、画像の中に描かれている一つの図形の内側のことなのか?
>opencvのminEnclosingCircle関数で外接円
領域内なのになぜ「外接」の情報を使用しようとしているのか?
「外接楕円」というものを想定しているのか?
>長軸短軸の長さを求めたいと考えています。
求めている「楕円」は【水平】か【垂直】どちらか方向にのみ押しつぶされた形状で、
斜めにつぶれた楕円は対象外ということでよろしいでしょうか?
> 楕円の長軸と短軸の長さを求めたいです
とだけ書かれた場合,まぁ「対象領域は十分に楕円」なのだろうな,と想像しますが……
そういう話なのであれば,例示するコードとしては
「謎の画像をロード→contour検出結果を対象として軸の長さを求む」みたいなのではなくて
「まず楕円を描画する→それを対象として軸の長さを求む→描画時の(正解の)値と比較」みたいな明確な形にするのが良いであろう,と思う.
ご指摘ありがとうございます。
おっしゃる通り、説明が不十分な点が多々ありました。申し訳ありません。
お二人の指摘を踏まえ、投稿を修正させていただきます。
回答3件
あなたの回答
tips
プレビュー