7

泥の中に虎のパグマーク(足跡の印象)の画像があります。パグマークの境界を検出したいのですが、前景と背景の強度が均一で、強度の変化で区別できません。パグマークと背景を区別するために何ができますか。

虎のパグマーク

4

2 に答える 2

9

両方がある場合のセグメンテーション タスクで

  1. 良いマーカー; と
  2. 関心のあるオブジェクトの周りの強いエッジ

次に、Watershed Transform によって直接解決されます。もちろん、問題はこれらのマーカーを取得することと、必要に応じて関連するエッジを強化することです。これらを取得するには、問題固有の知識が必要になる場合がありますが、あなたの問題については私にはありません。

それでも、有用な一般的な方法がいくつかあります。たとえば、Mathematical Morphology の接続演算子は、フラット ゾーンをマージおよび拡張する方法として機能します。したがって、問題の比較的良いマーカーを提供できる可能性があります。次の画像では、元の画像 (左の画像) のグレースケール バージョンでオープニング (一種の接続演算子) による形態学的再構成が実行され、残りの局所的な最大値が右に示されています。

ここに画像の説明を入力 ここに画像の説明を入力

これで、上の左の画像の形態学的勾配を取得できます。上の右の画像では、小さな円盤で穴埋めと拡張を行って、より滑らかな輪郭を取得することもできます。これにより、マーカー画像が定義されます。次に、マーカー イメージを使用してグラデーション イメージに Watershed Transform を適用し、ウォーターシェッド ラインを拡張 (表示方法に応じて浸食または膨張) すると、次のイメージが得られます。

ここに画像の説明を入力

大きすぎる領域や小さすぎる領域を簡単に破棄できると思います。次に、爪と手のひらに大まかな予想サイズがある場合は、無関係な領域を破棄できます。この時点では、領域を拡張して単一のコンポーネントを形成し、結果の輪郭を元の画像に表示するだけです。

ここに画像の説明を入力

各ステップを実行するためのサンプル コード (関連するステップは、コメント付きの Matlab コードにも示されています):

f = Import["http://imageshack.us/a/img407/4636/p1060993g.jpg"]
g = ColorConvert[f, "Grayscale"]                           (* g = rgb2gray(f); *)
(* First image shown: *)
geo = GeodesicOpening[g, DiskMatrix[5]]  (* geo = imreconstruct(imerode(g, ... *)
                                         (*         strel('disk', 6)), g);     *)
(* Second image shown: *)
marker = MaxDetect[geo]                        (* marker = imregionalmax(geo); *)

(* Watershed on gradient with markers. *)
mgrad = ImageSubtract[Dilation[geo, 1], Erosion[geo, 1]]; (* mgrad = ...       *)
          (* imdilate(geo,strel('square',3)) - imerode(geo,strel('square',3)); *)
ws = Image[           (* ws = watershed(imimposemin(mgrad, bwmorph(imfill(...  *)
 WatershedComponents[mgrad,      (* imregionalmax(geo),'holes'),'dilate'))));  *)
  Dilation[FillingTransform[marker], DiskMatrix[1]]]]

(* Third image shown: *)
wsthick = Erosion[ws // ImageAdjust, DiskMatrix[5]]

(* Connected component selection based on some supposed sizes. *)
ccs = SelectComponents[wsthick, "Count", 1000 < # < 3000 || 6000 < # < 10000 &]

(* Final image (thick border on binarized filled dilated ccs) *)
res = ImageAdd[f, Dilation[MorphologicalPerimeter[FillingTransform[
     MorphologicalPerimeter[Dilation[ccs, DiskMatrix[9]]]]], 2]]
于 2013-02-18T14:42:25.420 に答える
4

@mmpgの回答のアプローチは、使用されるアルゴリズムが各画像に固有の可能性があるパラメータの設定を必要とするため、不安定になる可能性があります。この問題は、形状に関する事前知識を持つパラメトリック モデルを使用することで、より適切にアプローチできるようです。

Active Shape Modelsフレームワークは、形状の境界を繰り返し近似します。まず、平均的な形状で初期化します (画像は単なる図であり、アルゴリズムの実際の出力ではありません)。

形状の初期化

輪郭はアンカー ポイントによって定義されます (煩雑さを避けるため、手のひらのみが青い目盛りで表示されます)。各反復で、アルゴリズムは各アンカーポイントの直交方向を考慮し、各距離での境界の確率を推定します(通常は画像勾配を使用しますが、あなたの場合はもっと複雑にする必要があります -ヒストグラム間の距離などのテクスチャの違いかもしれませんテクトンの)。ここで、赤い点はその分布の arg-maximums を強調しています。

エッジネス分布のモード

次に、新しい輪郭をデータに適合させて、形状の以前の分布を掛けた分布を最大化します。事前分布が一様であると仮定すると、新しい等高線は次のようになります。

新しい輪郭

実際には、非自明な形状分布が必要です。これを推定するには、パグマーク マスクが手動でラベル付けされた画像のトレーニング セットが必要です。

この MATLAB 実装を試してみてください。

于 2013-02-19T18:15:00.760 に答える