이미지의 바이너리 마스크를 만드는 방법

이미지 (img)를 다음과 같이 고려

여기에 이미지 설명 입력

다음을 수행 할 바이너리 마스크를 만들고 싶습니다. 정확히 전경을가립니다.

다음을 수행하면

b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned] 

얻습니다

여기에 이미지 설명 입력

머리가 원하는대로 완전히 흰색이 아니라는 것을 알 수 있습니다. 머리의 바닥이 이미지의 경계와 연결되어 있기 때문입니다. 둘째, 목 근처 (녹색 선으로 표시됨)에서 일부 픽셀은 검정색이며 흰색이어야합니다.

여기에 이미지 설명 입력

이 두 가지 문제를 어떻게 해결할 수 있나요?

댓글

  • Binarize 대신 MorphologicalBinarize를 시도하고 두 번째 인수를 사용할 수도 있습니다.
  • MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]는 좋은 출발점입니다.

답변

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 개의 마스크를 만들고 다음을 평가해야합니다.

여기에 이미지 설명 입력

그리기 도구로 마스크를 만들 수 있습니다. 여기 참조

답변

다음은 Alexey가 동기를 부여한 또 다른 솔루션입니다.

Opening[DeleteSmallComponents[ ColorNegate[ RegionBinarize[img, {{1, 1}}, 0.1, Method -> "MeanEuclidean"]], CornerNeighbors -> False], 1] 

결과 :

여기에 이미지 설명 입력

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다