2012-02-21 32 views
12

私が取り組んでいるプロジェクトのOpenCVで遊び始めました。
このプロジェクトでは、私は鉢植えで植物を栽培しています。異なる発達段階の静的な写真が上から撮影されます(下図参照)。opencvで葉のような形を検出するための最適なアプローチ

Original picture

目標は、異なる発達段階中に成長している植物の葉を検出し、最終的に(すなわち、大きさ)を測定することです。
私はCannyエッジ検出を使用する単純なアプローチを試みましたが、それは土壌中の小さなエッジを検出するため、それはうまくいきません(下の図参照)。

Canny edge detection

私はより良いアプローチは、色によって最初のセグメントへの画像だと思うし、その後葉を検出するために、いくつかのエッジ検出アルゴリズムを使用します。
良い方法がありますか?

あらかじめ葉の構造がわかっています。機械学習/分類アルゴリズムを使用してより良い結果を得ることができますか?

また、葉のサイズを測定する方法についても考えていませんか?サイズや他の記述子を測定するための一般的なパターンはありますか? (おそらく、画像に既知のサイズの参照オブジェクトがありますか?)。

最後に、私はまたある程度拡張するためにオクルージョンに対処しなければなりません。これは写真では見えませんが、後の開発段階では重なり合った葉を扱わなければならないかもしれません。 これに対処する方法はありますか?

私が処理しなければならない植物何千ものがあるかもしれないと、私の賛成でないバイアス絵(すなわち、土壌などをブラックアウト)することができます。

私の質問を要約すると:

  • (図を参照)土壌中の葉を検出するための最良の方法は何ですか?
  • 機械学習アルゴリズムは検出を改善できますか?
  • どのようにして葉のサイズを測定できますか?
  • オクルージョン/オーバーラップの葉を処理するにはどうすればよいですか?

私はいくつかのポインタやアイデアに本当に感謝しています。(Jeff7のコメントに基づいて)

更新

私が最初にFLOODFILLアルゴリズムとともに平均シフトカラーセグメンテーションを実行し、この絵になってしまった:

mean shift color segmentation

今Iその画像上で賢いエッジの検出+ findcontoursを実行すると、結果ははるかに良い:

Contours

答えて

3

画像を撮影する条件を十分に制御できるため、好きなことに偏ってください。黒いカードからマスクを作り、イメージをキャプチャするときに植物の根の周りに配置します。あなたの問題は、黒い背景に対して緑色のピクセルを見つけ出すことの1つに軽減されます。また、プラントの位置によってカメラの位置を制御するので、ピクセル/ mm比が一連の画像全体で一定であるような問題を整理できるはずです。リーフ領域は、ピクセルを数えるという単純な問題です。

これは、まだ、オクルージョンの問題に対処していません。おそらく、2つの画像、2つの直交する平面(さらに黒い背景を使用)の植物の高さを取って、植物の形状を知ることで、何かを見つけ出すことができます。コメントの後

EDIT ...

まあ、あなたの質問には「私は鍋に特定の植物を栽培しています。このプロジェクトのために」と、今あなたが気物事の何千ものを処理したいのステートメントが含まれています。私はまだあなたの好意でイメージをバイアスする可能性を追求したいと思います。たとえば、投稿した画像に背景に緑色のプラスチックがない場合は、画像の緑色のチャンネルで単純な閾値処理を行い、適切な精度で別々の画像を表示できます。 。緑色の背景を取り除き、画像を黒くするために土壌に水を注ぎます。

閉塞の問題として、何千もの植物に対処するための私の元の提案よりも賢明なことが必要になります。おそらく、あなたは各段階でいくつかの植物を犠牲にして、「直接のオーバーヘッドから観察された葉の面積」を測定し、葉を裂き、黒いカードに個別に配置し、

さらに編集

OK、あなたはあなたの好意で偏りのシーンをすることはできません。あなたは緑色の光だけを認めるためにカメラのフィルターを使用することを考えましたか?または緑色のオブジェクトを緑色のオブジェクトよりも明るくするイルミネーションですか?私はアイデアが不足してきました...この1上のアイデアを

FINAL EDIT

です。色を使って葉と背景を区別する独自のアプローチが良いと思います。葉の構造を知っているので、テンプレートマッチングを試みるかもしれませんが、ピクセルを数えるだけで面積と長さ(または面積と長さの違い)を見積もることができます。画像から形状測定値を導き出すための形態学的操作(例えば骨格化)を調べたいと思うかもしれません。あなたは、葉などのリモートセンシングに関する資料を参考にしてください。

私は、あなたの目標が実際に植物の発達を監視し、いくつかのアイデア(エッジ検出、機械学習など)があるコンピュータビジョンシステムの実装という目的に精神的にコミットしているという印象を受けます。あなたの適切な目的を達成することに貢献しない。

+0

フィードバックに感謝します。あなたは正しいです、私は条件を支配し、土壌を "黒くする"ことも考えました。 残念ながら、私は1つの工場だけでなく、時には何千人もの土壌を黒くすることは時間がかかり過ぎることもあるので、実際には可能ではありません。 葉のサイズを測定するには正しいです。これは、写真が常に同じ位置から取られ、ポットのサイズが同じであるため、実際に制御できます。 –

+0

混乱して申し訳ありません。元の質問を更新して少し明確にしました。私はちょうど例として1つの植物を示していましたが、私は通常それらの鍋の36をトレイに持っています。 –

+0

いいえ私はそれについて考えなかったが、これは良い提案です。ありがとう。私はそれを徹底的に調べます。 その設定で最も効果的なアルゴリズムや手法をお勧めしますか(ここで私は画像にバイアスをかけることはできず、この種の色分布を持つことができます)? –

3

平均シフトカラーセグメンテーション(サンプルディレクトリにOpenCVに含まれている例があります)を見てください。これを使用して画像を2つのクラス(植物や土壌)に分け、それを使ってデータをさらに処理することができます。

測定については、最初にオクルージョンエフェクトとカメラのキャリブレーションを無視して、プラントクラスの画像内の領域の一部を見たいと思うかもしれません。

個々のリーフを測定するには、時間情報とイメージ内の空間情報を使用する「トラッキング」アプローチが必要です。時間的情報は、前の画像におけるリーフの位置およびサイズであってもよい。おそらくあなたが応募できるテクニックはたくさんありますが、もし私があなたであれば、私は簡単に始まり、それがどれくらいあなたを得るのかを見ていきます。

+0

フィードバックいただきありがとうございます。私はあなたの入力に基づいて私の答えを更新しました。 良い結果を得るために平均シフトセグメンテーションパラメータを少し使い果たした(アルゴリズムをかなり遅くするような空間ウィンドウ半径をかなりの量だけ増やさなければならなかった) –

0

PlantCVは設定を制御するほど、ソフトウェアで行う作業が少なくて済むことを指摘しています。
播種位置を制御すると(トレイ上に散らばるのではなく)、苗木を覆い隠して背景の乱れを取り除くことができます。これは、個々のプラントで作業したり、異なるプラントで同じプラントを見つける上で重要な助けにもなります。重なり合う植物は、種子と芽を互いに隣に散らすとき、またはあなたの間隔の大きさを超えたときには、不可能な状況になります。最良の観察や最適な成長のために植えているかどうかを判断する必要があります。 2つは相互に互換性がありません。 私の経験では、color(cv2.inRange)をメインステップとして使用し、Cannyエッジ検出に移ってください。そこから輪郭線を得ることができます。 私はあなたがアラビドプシスを使用していると推測しているので、葉を数えるための円形パターンを探すかもし​​れません(レタスでは機能しません)。植物を分けて輪郭が(外)なら、cv2.contourAreaとcv2.minAreaRectangleを使っていくつかの基本的なメトリクスを得ることができます。 これは私が働いているルートです。

0

これは研究の活発な分野です。

  • Scharrら:私は、次の書類をお勧めします。 2016:植物の表現型の葉のセグメンテーション:照合調査(pdf

  • ベルとディー2016:鑑賞植物の成長・コンピュータビジョンとシロイヌナズナ上のポジションペーパーを。 http://doi.org/10.1049/iet-cvi.2016.0127

PlantCVは、距離変換と流域で葉をセグメント化するためのいくつかの施設を持っている、と私はより多くを追加したいと思います。 preprintを参照してください。改訂版はすぐにPeerJに掲載されます。

関連する問題