Tekintsünk egy képet (img
)
Szeretnék létrehozni egy bináris maszkot, amely pontosan fedje le az előteret.
Ha a következőt teszem
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
kapok
Láthatja, hogy a fej nem teljesen fehér a kívánt módon, és ez lehet annak a ténynek köszönhető, hogy a fej alja a kép határához kapcsolódik. Másodszor, a nyak közelében (amint azt a zöld vonal jelzi) néhány képpont fekete, amelynek fehérnek kell lennie.
Hogyan tudom megoldani ezt a két problémát?
Megjegyzések
jó kiindulópont.
Válasz
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Sima körvonal (köszönhetően a Rahul -nak):
Binarize@CurvatureFlowFilter[img2, 3]
Válasz
Ez a megközelítés ImageData
az egész kép helyett a vonalakon dolgozni. Néhány manipuláció után észleli az egyes vonalak első és utolsó fehér képpontját, és az egész szegmenst 1
(azaz fehér) állásba fordítja.
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
Válasz
A GrowCutComponents[]
használatával ezt meg lehet szerezni:
Egy kis emelés a dilatációval / erózióval valószínűleg javítja az eredményt.
Hogyan kell használni az GrowCutComponents[]
alkalmazást?
létre kell hoznia a 2 maszkot, és ki kell értékelnie a következőket:
A maszkokat a Rajzeszközökkel lehet létrehozni lásd itt
MorphologicalBinarize
-t aBinarize
helyett, és játszhat a második argumentummal is. A “>