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

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

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

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

Python 3.x

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

Q&A

解決済

3回答

2424閲覧

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

papikonoqui

総合スコア10

OpenCV

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

Python 3.x

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

0グッド

0クリップ

投稿2022/11/29 07:15

編集2022/11/30 10:49

前提

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

実現したいこと

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

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

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

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

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

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

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

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

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

回答3

0

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

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

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

投稿2022/11/29 08:21

jbpb0

総合スコア7651

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

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

papikonoqui

2022/11/30 01:46

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

0

ベストアンサー

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

投稿2022/11/29 10:21

fana

総合スコア11632

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

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

fana

2022/11/29 10:27 編集

minAreaRect() でもよいかもしれん.(←この関数の名前,何故かいつも忘れる!)
退会済みユーザー

退会済みユーザー

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()関数で長軸短軸の長さを得ることができました! 非常に助かりました。ありがとうございました。
guest

0

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

投稿2022/11/29 07:23

y_waiwai

総合スコア87719

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

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

papikonoqui

2022/11/29 07:59

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

2022/11/30 01:47

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問