Grabcut 알고리즘을 사용하여 배경 빼기를 구현했습니다. 하지만 소스 이미지에서 자른 이미지에 원치 않는 공백이있었습니다. 잘린 이미지의 공백을 제거하는 방법.?
단계 :
카메라에서 비디오를 읽고 이미지를 읽습니다. 내 입력 이미지 :
Grabcut 알고리즘 적용.
cv :: grabCut (이미지,
결과,
rectangle1, bgModel, fgModel, 1, cv :: GC_INIT_WITH_RECT); cv :: compare (result, cv :: GC_PR_FGD, result, cv :: CMP_EQ);
소스에서 전경 이미지를 자릅니다.
cv :: 매트 전경 (image.size (), CV_8UC3, cv :: Scalar (255,255,255)); image.copyTo (전경, 결과);
내 출력 이미지 :
이미지에서 얼굴 영역의 공백을 제거하는 방법은 무엇입니까?
세 가지 해결책을 생각할 수 있습니다. 이들 각각은 결과 추출 영역 (즉, Grabcut 알고리즘을 사용한 후 파생 된 영역)에 적용되어야합니다.
추출 된 영역의 경계에있는 각 픽셀에 대해 :
추출 된 개체의 경계에도 속하는이 픽셀의 가까운 이웃을 가져옵니다.
이 이웃에 속하는 픽셀에 직선 A 를 맞추십시오 (openCV에는이를 수행하는 함수가 있습니다 : fitline () )
적합 선에 수직 인 선 B 를 계산합니다 .
라인 B에 있고 Grabcut 알고리즘으로 추출한 영역에 속하는 픽셀을 제거 / 색칠합니다.
애플리케이션에서 사용자가 이미지를 클릭하고 일부 옵션을 선택하여 수동으로이 작업을 적용 할 수있는 경우 위에 제공된 알고리즘이이 단계에서 문제를 해결합니다. 사용자는 필요한만큼이 작업을 수행하고 고정 된 하드 코딩 된 일부를 제거 할 수 있습니다. 작업이 수행 될 때마다 B 라인을 따라있는 픽셀 수 또는 작업이 호출 될 때마다 제거되어야하는 픽셀 수를 제공합니다.
사용자 상호 작용없이 수행 해야하는 경우 또 다른 문제는 라인 B 를 따라 제거해야하는 픽셀 수를 결정하는 것입니다. 이 문제에 대한 해결책은 처리 할 이미지가 얼마나 유사한 지, 배경이 균일한지 또는 색상 그라데이션이 크게 다를 수 있는지에 따라 다릅니다. 예를 들어 테두리에있는 픽셀의 값을 배경의 평균 픽셀 값 (또는 배경이 균일 한 색상이 아닌 경우 배경의 일부)과 비교할 수 있습니다.- 충분히 유사한 경우 (그리고 알아 내야합니다. , 특정 애플리케이션에 대해 충분히 유사 함 ) 픽셀이 제거됩니다.
경계 픽셀을 반복하고 해당 값을 배경 픽셀 값과 비교합니다 (세부 사항은 솔루션 1 참조 ). 픽셀 값이 배경 값 과 충분히 유사 하면 ( 솔루션 1 참조 ) 픽셀을 제거합니다.
사용자가이 작업을 적용 할 때마다 테두리 픽셀은 값을 확인하지 않고 제거됩니다. 이 작업의 깊이 (즉, 제거되는 가장자리에 가까운 픽셀 수)는 하드 코딩되거나 사용자가 지정할 수 있습니다. 일종의 이미지 침식 이라고 생각할 수 있습니다 .
솔루션 1 은 특히 사용자가이 작업을 수동으로 수행해야하는 경우 더 정확한 결과를 산출 할 수 있지만 솔루션 2 는 구현하기가 훨씬 쉽고 계산 복잡성이 적습니다.
솔루션 3 은 가장 간단하지만 작업이 수행 될 때마다 전체 사진이 잘리고 실제로 자르기가 필요한 부분 만 잘 리기 때문에 가장 정확하지 않습니다. 많은 경우에 이것은 거의 보이지 않을 수 있으므로 시도해 볼 가치가 있습니다. 또한이 솔루션은 사용자가이 작업을 수동으로 수행해야하는 경우에만 적합합니다 (알고리즘이 제거해야하는 픽셀 수를 결정할 수 없기 때문에).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다