画像のバイナリマスクを作成する方法

画像(img)を

<と見なしますp> ここに画像の説明を入力

バイナリマスクを作成したいフォアグラウンドを正確にカバーします。

次の操作を行うと

b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned] 

取得

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

頭が希望どおりに完全に白くないことがわかりますが、これは次のようになります。頭の下部が画像の境界に接続されているためです。次に、首の近く(緑色の線で示されている)では、一部のピクセルが黒で、白である必要があります。

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

これら2つの問題を修正するにはどうすればよいですか?

コメント

  • Binarizeの代わりにMorphologicalBinarizeを試して、2番目の引数で遊ぶこともできます。
  • MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]は良い出発点です。

回答

img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10] 

画像

滑らかなアウトライン( Rahul に感謝):

Binarize@CurvatureFlowFilter[img2, 3] 

画像

回答

このアプローチではImageData画像全体ではなく、線で作業する。数回の操作の後、各行の最初と最後の白いピクセルを検出し、セグメント全体を1(つまり白)にします。

img = Import["https://i.stack.imgur.com/Mw1iJ.png"] edges = EdgeDetect[img, 2] data = ImageData@edges; Table[line = data[[j]]; pos = Flatten@Position[line, 1]; If[Length[pos] > 1, data[[j, pos[[1]] ;; pos[[-1]]]] = 1]; , {j, Length@data}]; Image@data 

ここに画像の説明を入力

回答

GrowCutComponents[]を使用すると、次のように取得できます:

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

膨張/侵食で少し持ち上げると、おそらく結果が改善されます。

GrowCutComponents[]の使用方法?

2つのマスクを作成し、以下を評価する必要があります:

ここに画像の説明を入力

描画ツールこちらをご覧ください

回答

これがAlexeyが動機付けたもう1つのソリューションです。

Opening[DeleteSmallComponents[ ColorNegate[ RegionBinarize[img, {{1, 1}}, 0.1, Method -> "MeanEuclidean"]], CornerNeighbors -> False], 1] 

結果は次のとおりです。

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です