Harkitse kuvaa (img
) nimellä
Haluan luoda binaarisen maskin, joka peitä etuala tarkasti.
Jos teen seuraavat
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
Saan
Voit nähdä, että pää ei ole täysin valkoinen toivotulla tavalla, ja tämä voi olla johtuu siitä, että pään pohja on kytketty kuvan rajaan. Toiseksi, lähellä kaulaa (vihreän viivan osoittamalla tavalla), jotkut pikselit ovat mustia, joiden pitäisi olla valkoisia.
Kuinka voin korjata nämä kaksi ongelmaa?
Kommentit
Vastaa
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Tasattu ääriviiva (kiitos Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
vastaus
Tämä lähestymistapa käyttää ImageData
työskennellä viivojen sijaan koko kuvan kanssa. Muutaman käsittelyn jälkeen se tunnistaa jokaisen rivin ensimmäisen ja viimeisen valkoisen pikselin ja kääntää koko segmentin 1
(eli valkoiseksi).
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
Vastaa
GrowCutComponents[]
-sovelluksella voit saada tämän:
Hieman nostaminen Dilatation / Erosion -toiminnolla parantaa tulosta.
Kuinka käyttää GrowCutComponents[]
?
sinun on luotava 2 naamiota ja arvioitava seuraavat:
Maskit voidaan luoda piirtotyökaluilla katso täältä
MorphologicalBinarize
Binarize
-kohdan sijaan ja pelata myös toisella argumentilla.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
on hyvä lähtökohta.