画像(img
)を
バイナリマスクを作成したいフォアグラウンドを正確にカバーします。
次の操作を行うと
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
取得
頭が希望どおりに完全に白くないことがわかりますが、これは次のようになります。頭の下部が画像の境界に接続されているためです。次に、首の近く(緑色の線で示されている)では、一部のピクセルが黒で、白である必要があります。
これら2つの問題を修正するにはどうすればよいですか?
コメント
回答
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つのマスクを作成し、以下を評価する必要があります:
描画ツールこちらをご覧ください
Binarize
の代わりにMorphologicalBinarize
を試して、2番目の引数で遊ぶこともできます。MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
は良い出発点です。