質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
86.02%
OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

楕円の長軸・短軸の長さを求めたい

papikonoqui
papikonoqui

総合スコア10

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

3回答

0グッド

0クリップ

544閲覧

投稿2022/11/29 07:15

編集2022/11/29 08:22

前提

楕円の長軸と短軸の長さを求めたいです。

実現したいこと

まずは長軸から求めようと考えています。
→長軸は図形領域内で最長なので求めやすいと考えました。

今考えている方法としては、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を使用しています。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jbpb0

2022/11/29 07:47 編集

> 楕円の長軸と短軸を求めたい 求めたいのは、長軸と短軸そのもの(位置・向き・長さ)でしょうか? それとも、長軸と短軸の長さ(長径と短径)だけ求まればいいのでしょうか? > 外接円を求め、その直径を楕円の長軸とする から、長さだけ求まればいいのかな、と想像しました
papikonoqui

2022/11/29 08:05 編集

説明足らずで申し訳ありません。 長軸短軸の長さを求めたいと考えています。
yominet

2022/11/29 15:32

「求めたい楕円」の条件がわからないのでそれをきちんと定義してもらえますでしょうか このサイトは画像も貼れるのでイメージ図を書いてみてもいいかもしれない。 また、その際、対象となる元情報は想定される中で一番複雑な形状も合わせて書いた方がいい。 >→長軸は図形領域内で最長なので求めやすいと考えました。 「図形領域内」とは? #画像全体の領域のことなのか、画像の中に描かれている一つの図形の内側のことなのか? >opencvのminEnclosingCircle関数で外接円 領域内なのになぜ「外接」の情報を使用しようとしているのか? 「外接楕円」というものを想定しているのか? >長軸短軸の長さを求めたいと考えています。 求めている「楕円」は【水平】か【垂直】どちらか方向にのみ押しつぶされた形状で、 斜めにつぶれた楕円は対象外ということでよろしいでしょうか?
fana

2022/11/30 01:09

> 楕円の長軸と短軸の長さを求めたいです とだけ書かれた場合,まぁ「対象領域は十分に楕円」なのだろうな,と想像しますが…… そういう話なのであれば,例示するコードとしては 「謎の画像をロード→contour検出結果を対象として軸の長さを求む」みたいなのではなくて 「まず楕円を描画する→それを対象として軸の長さを求む→描画時の(正解の)値と比較」みたいな明確な形にするのが良いであろう,と思う.
papikonoqui

2022/11/30 01:49

ご指摘ありがとうございます。 おっしゃる通り、説明が不十分な点が多々ありました。申し訳ありません。 お二人の指摘を踏まえ、投稿を修正させていただきます。

回答3

2

楕円の長軸・短軸の長さを求めたい

短軸の求め方が分からない

この点は内側?
のコードの「radius」が内接円の半径

投稿2022/11/29 08:21

jbpb0

総合スコア7521

spoofy_dragon, papikonoqui😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

papikonoqui

2022/11/30 01:46

回答ありがとうございます。 内接円の半径が楕円の短軸の長さに該当することが完全に盲点でした。 参考にさせていただきます。

1

ベストアンサー

話がよくわからないけど,対象の形状が楕円だと分かっている状況を前提としているなら,頭からっぽにして fitEllipse() を一発使えばよいのでは.
(それだと目的に対して大仰だから他の方法を探している?)

投稿2022/11/29 10:21

fana

総合スコア10681

fourteenlength👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

fana

2022/11/29 10:27 編集

minAreaRect() でもよいかもしれん.(←この関数の名前,何故かいつも忘れる!)
fourteenlength

2022/11/29 21:16

fanaさん: 完璧にcv2.fitEllipse()関数でOKそうですね。 papikonoquiさん: 参考URL: https://pystyle.info/opencv-structural-analysis-and-shape-descriptors/ > center, length, angle = cv2.fitEllipse(points) > 引数 > ・ points: (NumPoints, 1, 2) の numpy 配列。輪郭。 > 返り値 > ・ center: 楕円の中心 > ・ length: 楕円の長軸、短軸の長さ > ・ angle: 楕円の回転角度
papikonoqui

2022/11/30 01:40

回答ありがとうございます。 cv2.fitEllipse()関数で長軸短軸の長さを得ることができました! 非常に助かりました。ありがとうございました。

1

楕円であるなら、長軸の垂直な軸が短軸になる、んでは

投稿2022/11/29 07:23

y_waiwai

総合スコア86072

spoofy_dragon👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

papikonoqui

2022/11/29 07:59

回答ありがとうございます。 opencvのminEnclosingCircleから、外接円の直径の長さを求めることはできますが、その両端の座標は取得できるのでしょうか。 この両端の座標と外接円の中心の3点が垂直な線を求めるのに必要と考えています。
fana

2022/11/30 01:47

クソみたいな方法(精度面もどうかなという感じだが,それ以前に「だったらもう最初から主軸方向でも求めてろよ」という感じの話)ですが… 既に得られている外接円を用いるなら,その外接円と元の楕円領域との差(e.g. 真っ黒な画像に円を白で塗りつぶし描画した後に,領域を黒で塗りつぶし描画した結果)を考えると,理屈上は2つの領域が(楕円の中心から見て短軸方向の両側に)残るような形になるので,それらの領域の重心でも求めてやれば,短軸の方向は推定できるかな. (※画像のpixelで戦う話なので「理屈上は2つ…」のところに多分ちょっとしたごまかしが必要.都合が良い方向にモルフォロジしてやるとか)

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。