葉の静脈を分割する最良の方法は?


47

私は多くの研究をしており、葉の静脈を検出するのに使用できる適応しきい値や流域などの方法を見つけました。ただし、多くのノイズが発生するため、しきい値設定は適切ではありません。

私の画像はすべて灰色の画像です。緊急の助けが必要なこの問題を考慮しながら、誰がどのアプローチを採用するか提案してください

編集:元の画像

ここに画像の説明を入力してください

しきい値処理後

ここに画像の説明を入力してください

答えが示唆するように、私は次のエッジ検出を試みました

  1. キャニー

多すぎるノイズと不要な妨害

ここに画像の説明を入力してください

  1. ソーベル

ここに画像の説明を入力してください

  1. ロバーツ

ここに画像の説明を入力してください

編集:もう1つの操作を試みましたが、次の結果が得られました。キャニーとアダプティブで試したものよりも良いですか?

ここに画像の説明を入力してください


画像を見せていただけますか?
ジョナス

画像を追加しました
-vini

@vini現在、テンプレートの一致を後から得るための前処理ステップとしてこれを行っていますか?また、単純なしきい値処理を通じて、どのようにして2番目の画像を取得しましたか?
スペイシー

私の目的は、出力に浮遊アーティファクトが含まれないように、静脈をセグメント化することで可能な限り最高の結果を得ることです。私は適応しきい値処理を使用して2番目の画像を取得しました
vini

指定した画像から、しきい値設定された画像で(さまざまな)フィルターを使用しているように見えます。これは非常に悪い結果をもたらします。元のイメージでフィルターを使用してから、出力のしきい値を設定する必要があります。
ベンジョン

回答:


56

エッジ(=グレー値の高い領域と低い領域の間の境界線)を探しているのではなく、隆線(その周囲よりも細い線または細い線)を探しているので、エッジフィルターは理想的ではないかもしれません:エッジフィルターは2つの側面(ラインの両側に1つ)とラインの中央に低い応答を提供します。

フィルターサンプル

追加:エッジ検出器とリッジ検出器の違いをより明確に説明するよう求められた場合。この回答が非常に長くなっている場合は、事前に謝罪します。

エッジ検出器は(通常)一次微分演算子です:入力画像を3Dランドスケープとして想像する場合、エッジ検出器はそのランドスケープの各ポイントで傾斜の急峻さを測定します:

ここに画像の説明を入力してください

拡張された明るい領域または暗い領域の境界線を検出する場合、これで十分です。しかし、OPの画像の静脈については、同じことを示します。各静脈の左右の輪郭:

ここに画像の説明を入力してください

また、キャニーエッジ検出器の結果の「二重線パターン」についても説明します。

ここに画像の説明を入力してください

それでは、これらの細い線(つまり、尾根)をどのように検出しますか?アイデアは、ピクセル値を(局所的に)2次多項式で近似できることです。つまり、画像関数が場合、と小さな値に対して:gxy

g(x,y)12x22gx2+xy2gxy+12y22gy2+xgx+ygy+g(0,0)

または、マトリックス形式で:

g(x,y)12(xy).(2gx22gxy2gxy2gy2).(xy)+(xy).(gxgy)+g(0,0)

二次微分行列は「ヘッセ行列」。興味のある2次構造を記述します。(2gx22gxy2gxy2gy2)

この関数の2次部分は、上のヘッセ行列をその固有値の対角行列の回転倍に分解することにより、ある角度だけ回転した2つの放物線の合計に変換できます。(マトリックス分解)。回転は気にしません(どの方向の尾根も検出したいので)、とのみ関心があります。λ1x2+λ2y2λ1λ2

この関数近似にはどのような形状がありますか?実際、それほど多くはありません:

ここに画像の説明を入力してください

隆起を検出するために、上のプロットの最後のように見える画像内の領域を見つけたいので、ヘッシアンの主要な固有値が大きい領域を探しています(マイナーな固有値と比較して)。これを検出する最も簡単な方法は、各ピクセルで主要な固有値を計算することです。これが、以下のリッジフィルターの機能です。


リッジフィルタは、おそらくより良い結果が得られます。Mathematicaの組み込みRidgeFilter(各ピクセルでヘッセ行列の主要な固有値を計算)を画像で試しました:

リッジフィルター

ご覧のとおり、すべての細い暗線にはピークが1つしかありません。バイナリ化とスケルトン化の結果:

ここに画像の説明を入力してください

スケルトンを切り取り、画像から小さなコンポーネント(ノイズ)を削除すると、この最終的なスケルトンが得られます。

ここに画像の説明を入力してください

完全なMathematicaコード:

ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]

追加:

私はMatlabの専門家ではありません。リッジフィルターが組み込まれているかどうかはわかりませんが、「手作業で」実装する方法を示します(再びMatematicaを使用)。先ほど言ったように、リッジフィルターはヘッセ行列の主要な固有値です。Mathematicaでその固有値を記号的に計算できます:

eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]

=>12(Hxx+Hyy+Hxx2+4Hxy22HxxHyy+Hyy2)

あなたがしなければならないのは、二次導関数、、を計算し(ガウスフィルターのsobelまたは導関数を使用)、それらを挿入することです上記の式に追加すると、リッジフィルターが得られます。 H xy H yyHxxHxyHyy


はい、それはまさに私が望むものですが、私はMATLABでそれをやっていて、リッジフィルターの同等物を見つけることが難しくなっています
-vini

1
@nikie非常に良い答え-質問-画像処理を行っていない人にとって、エッジ検出器とリッジ検出器の違いについて詳しく説明してください。再びありがとう
スペイシー

@Mohammad:私が試した、私は数学にもかかわらず、今では少し明確になさを願って
ニキEstner

リッジフィルターを試しても満足のいく結果が得られない
vini

2
@vini:「満足のいく結果が得られない」と言っても、あまり意味がありません。私が投稿したものと同じ結果画像が得られますか?「満足できない」とは何ですか?
ニキエストナー

6

キャリーエッジ検出(Halcon)を使用して、アルファを1、低しきい値8および高しきい値13(1〜255のスケール)で使用すると、次の結果が得られます。

キャニーエッジ検出リーフ

パラメーターを調整すると、Cannyから得られる結果をさらに改善できます。この画像を使用して、短いエッジをスキップしてノイズを除去し、長いエッジを接続して最終結果を得ることができます。

ところで:異なる色は異なるエッジを示します。

このオンラインのCannyエッジ検出器を使用して、かなり似た結果を得ることができます:

  • 画像を選択I9Pxl.png
  • シグマ1.2
  • T-ロー0.04
  • T-high 0.07
  • その他の設定のデフォルト
  • 結果の更新ビューをクリックします

ありがとう:)キャニーは最高だと思います;)ところで、キャニーを結果に適用するとさらに良い結果が得られるかもしれません。
Geerten

ところで:あなたが気付いていない場合:キャニーエッジ検出器の制限は何ですか?ここであなたの意見を述べることができます!
ディパンMehta

あなたが私に言っている場合:私はあなたの質問で私の見解をすでに与えました。あなたが一般にコメントを与えている場合:私はこのコメントを削除します。
-Geerten

そうそう、私はこれを知らなかった!
ディパンMehta

あなたの答えしかし、気の利いたのdoesntのおかげであなたが示したように検出されていない葉の葉脈の細部を維持する...
VINI

6

上記の優れた答えに続いて、scikit funcitonsを使用してPythonでそれを行う方法があります。

from skimage.feature import hessian_matrix, hessian_matrix_eigvals

#assume you have an image img

hxx, hxy, hyy = hessian_matrix(img, sigma=3)
i1, i2 = hessian_matrix_eigvals(hxx, hxy, hyy)

#i2 is the variable you want.

#Visualise the result
import matplotlib.pyplot as plt
plt.imshow(i2)

どうimgすればいいですか?私が持っているpngファイルを、それが動作しません。
シグル

imgは2次元のnumpy配列でなければなりません。
マシュー

実際にi1は、大きい方の固有値なので、それを使用する必要があります。
ロブ

これは私が今まで見た中で最も明確な説明です!
ユーレカ

3

しきい値処理の代わりに、単純なエッジ検出を適用しました。

Gaussianの違いでGIMPを使用-Radious Outer:3.0およびInner:1.0。

ここにそれがどのように見えるかです。

ここに画像の説明を入力してください

さらに、メジアンフィルターまたは収縮/膨張を適用して、粒子の粗いノイズを除去することができます。

gimpの実装を説明するページがあります

ラプラシアンオブガウスやディファレンスオブガウシンなどのさまざまな手法を参照する必要があります。これを参照してください:http : //homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7

この回答は、ラプラシアンはアンシャープマスクにどのように使用されますか?


GIMP?どのエッジ検出器ですか?
vini

1
いいえ-画像編集パッケージです。それは簡単なチェックでした-ポイントを前に出すためだけです。-しきい値処理ではなくエッジ検出を使用してください。
ディパンMehta

GIMPはどのエッジ検出器を使用しますか?ごめんなさい、それについてほとんど知識がありません
-vini

@viniがリファレンスを追加しました。
ディパンMehta

3

このトピックは常に多くの関心を集めてきましたが、このトピックに関する本当のコンセンサスはありません。したがって、私はいくつかの言葉を落とすことにしました。

stackexchange(Q1およびQ2)で以前に尋ねられた同様の質問に対する私の答えには、Stegerによるサブピクセル曲線構造抽出アルゴリズムが含まれていました。この方法は、この方法を含め、多くの場合、幸運にもかなりうまく機能しました。したがってここに画像の説明を入力してください 、ここに出力画像を投稿します: ここで、異なるパラメーター設定で、接続性の色付けなし: ここに画像の説明を入力してください 詳細と適切な参照については、私が参照したstackexchangeの投稿を参照してください。


0

工学研究の割り当ての最後の年の一環として、眼底画像の血管のセグメンテーション方法を研究しなければなりませんでした。このツリー再構築方法(Cohen、Laurent D.、Mille、Julienによる)は、Fast-Marching Methodsと一緒に使用すると特に興味深いことがわかりました。

あなたが調べたいと思うかもしれない他の論文:

  • 測地線のアクティブな輪郭
  • 3Dラティスの高速マーチングメソッドの実装について
  • Multistencils FMM:デカルト領域上のアイコナール方程式の非常に正確な解

便利なリンク:-2Dおよび3Dのフロント伝播

これが少しでも役立つことを願っていますが、正確には最先端ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.