Programming/OpenCV

[OpenCV] cvFloodFill

빠릿베짱이 2012. 11. 8. 01:13
반응형

ㅇ 함수 원형

void cvFloodFill(
CvArr* image,
CvPoint seed point,
CvScalar new val,
CvScalar lo diff=cvScalarAll(0),
CvScalar up diff=cvScalarAll(0),
CvConnectedComp* comp=NULL,
int flags=4,
CvArr* mask=NULL );

 

ㅇ 설명

처음 이 함수를 접하고 몹시 당황스러웠다. 단순 Seed를 기준으로 유사하면 연결하여 원하는 색상으로 채운다고 생각을 하고 접근했는데, 결과가 이상하게 나왔다. 분명 다른 누군가도 가끔 이해가지 않는 결과가 나오기 때문에 검색하여 들어오게 되었을 것이다.

여러가지 실험결과 다음과 같은 결론을 내렸다.

본 알고리즘은 간단하게 레이블링하여 조건에 맞는 연결된 픽셀들을 하나로 묶어 new val로 채우는 역할을 하는데

처음에 헷갈렸던 이유는 Seed를 기준으로 lo dff와 up diff를 이용하여 채울지 말지 결정하는지 알았다.

하지만 정확히 말하면 초기 Seed가 아닌 프로세스가 따라가면서 현재 위치의 픽셀 값을 기준으로 한다는 결론이 나왔다.

즉, 비교 대상이 계속 변한다는 것이다.

2차원으로 생각하지말고, 1차원으로 간단하게 설명하자면

예를 들어

입력 데이터

100 50 30 20 10 9 0 10 20 30 50

이런식으로 데이터가 있다면

초기 시드 위치를 맨 처음 위치인 100으로 잡고

up diff = 0, lo diff = 100 이라고 설정하였다면

100 50 30 20 10 9 0 -> 여기까지만 new val로 채워진다는 의미이다.

맨 처음 100을 기준으로 50은 50만큼 작다 따라서 lo diff 가 100이므로 100보다 작은 차이를 갖기 때문에 연결되고

50을 기준으로 30도 20의 차이가 나는데 이 또한 100보다 작으므로 연결된다.

하지만 0 까지 도달하여 0을 기준으로 옆에 10을 비교했을때는 0보다 10이 큰데, up diff가 0 이므로 연결 실패이다.

따라서 100 50 30 20 10 9 0  여기까지만 new val로 채워질 것이다.

 

반응형