Považujte obrázek (img
) za
Chci vytvořit binární masku, která bude přesně pokrýt popředí.
Pokud provedu následující
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
dostanu
Můžete vidět, že hlava není zcela bílá podle přání a může být vzhledem k tomu, že spodní část hlavy je spojena s hranicí obrazu. Zadruhé, poblíž krku (jak je naznačeno zelenou čarou) jsou některé pixely černé, které by měly být bílé.
Jak mohu vyřešit tyto dva problémy?
Komentáře
Odpověď
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Vyhlazený obrys (díky Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
Odpověď
Tento přístup používá ImageData
pracovat na řádcích, spíše než na celém obrázku. Po několika manipulacích detekuje první a poslední bílý pixel na každém řádku a otočí celý segment na 1
(tj. Bílý).
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
Odpověď
Pomocí GrowCutComponents[]
lze získat toto:
Výsledek pravděpodobně vylepší trochu zvednutí pomocí funkce Dilatace / Eroze.
Jak používat GrowCutComponents[]
?
Musíte vytvořit dvě masky a vyhodnotit následující:
Masky lze vytvořit pomocí Nástroje pro kreslení viz zde
MorphologicalBinarize
místoBinarize
a pohrát si také s druhým argumentem.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
je dobrým výchozím bodem.