이미지 (img
)를 다음과 같이 고려
다음을 수행 할 바이너리 마스크를 만들고 싶습니다. 정확히 전경을가립니다.
다음을 수행하면
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
얻습니다
머리가 원하는대로 완전히 흰색이 아니라는 것을 알 수 있습니다. 머리의 바닥이 이미지의 경계와 연결되어 있기 때문입니다. 둘째, 목 근처 (녹색 선으로 표시됨)에서 일부 픽셀은 검정색이며 흰색이어야합니다.
이 두 가지 문제를 어떻게 해결할 수 있나요?
댓글
답변
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
Answer
GrowCutComponents[]
를 사용하면 다음을 얻을 수 있습니다.
확장 / 침식을 조금만 올리면 결과가 개선 될 수 있습니다.
GrowCutComponents[]
사용 방법?
2 개의 마스크를 만들고 다음을 평가해야합니다.
그리기 도구로 마스크를 만들 수 있습니다. 여기 참조
Binarize
대신MorphologicalBinarize
를 시도하고 두 번째 인수를 사용할 수도 있습니다.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
는 좋은 출발점입니다.