2017-01-23 21 views
0

이진 이미지가 있고 OpenCV에서 다음을 수행한다고 가정합니다. 점이 주어지면 점이 속한 연결된 구성 요소의 면적과 둘레를 측정합니다.OpenCV 연결된 구성 요소의 경계 및 점

def areaAndPerimeter(point): 
    ...do some stuff... 
    return area, perimeter 

각 연결된 구성 요소의 둘레와 영역을 찾기 위해 cv2.findContours()을 사용할 수는 있지만 입력 정보와 쌍을 이루는 방법을 모르겠습니다. 어떤 주변 및 영역이 연결된 구성 요소에 해당하는지 point

+1

당신은'connectedComponentsWithStats()'를하고 각 블롭의 모든 포인트를 같은 색으로 라벨링한다고 생각합니다. 따라서 해당 지점에 해당하는 색상 (예 : 라벨)을 찾아 해당 색상이 속한 얼룩을 찾을 수 있습니다. 나는 절망적으로 잘못 될 수 있습니다! 그것은 Matlab에서'bwlabel()'이라고 불리우며, 저는 믿습니다. –

+0

네, 이전에''connectedComponents()''를 사용하고 각 구성 요소를 1 씩 추출하고 각각에 대해''findContours()''를 실행하는 솔루션을 개발하기 시작했습니다. 그러나 그런 낭비처럼 보입니다 한 번 전체 이미지에서''findContours()''를 실행하고 연결된 구성 요소를 모두 건너 뛸 수있을 때. – mv3

답변

0

이 함수의 경우 점에서 시작하여 영역이 커집니다. F 전경 픽셀을 포함하고 B은 경계 픽셀 (오른쪽 흰색 사람의 외부 검은 사람)를 포함, 끝에

- Define a point queue Q 
- Define a foreground point vector F 
- Define a boundary point vector B 
- Put starting point in Q 
- While Q is not empty 
     - p = Q.top 
     - if p is foreground 
      - F.push(p) 
      - Q.push(neighbors of p) 
     - else 
      - B.push(p) 
- Return size(F), size(B) 

: 아래 의사 코드입니다. 따라서 size(F)은 면적을 제공하고 size(B)은 둘레를 나타냅니다.

+0

이러한 좋은 경계 및 면적 측정 값입니까? 나는 이것들을 정의로서 취할 수 있다고 생각하지만, 이것을 시도 할 때 opencv 함수 "cv2.arcLength()"및 "cv2.contourArea()"의 결과와 일치하지 않습니다. 윤곽선 자체의 크기는 주변의 정의와 일치하지만,''cv2.arclength()''함수는 그 것과 같지 않고 예상 한 결과에 더 가깝습니다. – mv3

+0

거리 (즉, 유클리드 대 맨해튼 거리)에 대한 여러 가지 방법이 있으므로 면적과 호 길이는 이미지 도메인이 이산이므로 사용자의 근사치에 따라 달라집니다. 위의 코드는 "전경에 몇 개의 픽셀이 있습니까?" 및 "얼마나 많은 픽셀이 경계에 있습니까?" OpenCV의 근사값을 사용하려면'B'의 모든 점을 사용하고'cv2.contourArea (B)'와'cv2.arcLength (B)'를 실행하십시오. – ilke444

+0

필자는 현재 연결된 컴포넌트를 찾기 위해''cv2.connectedComponents()''를 사용하여 현재 수행중인 작업과 비교하여 타이밍을 시험해보고, 내 포인트의 구성 요소를 추출한 다음''cv2.findContours()''그리고 나서''cv2.contourArea()''와''cv2.arcLenth()''를 호출합니다. – mv3

관련 문제