더북(TheBook)

도전 11 이미지 세그먼테이션

C 표준 라이브러리 말고도 다양한 기능을 제공하는 라이브러리가 많이 나와 있다. 그 중에서 이미지 처리 기능을 제공하는 것이 많이 있는데, C로 구현됐거나 C 인터페이스를 제공하면서 그레이스케일 이미지를 unsigned char 타입의 2차원 행렬로 다룰 수 있는 라이브러리를 찾아보기 바란다.

이 도전의 목적은 이렇게 구성한 이미지에 세그먼테이션(segmentation)을 수행하는 데 있다. 다시 말해 서로 비슷한, 연결된 영역의 픽셀끼리 그룹(unsigned char 원소로 구성된 행렬)으로 묶는 것이다. 이렇게 묶은 단위는 픽셀 집합을 분할하는데, 도전 4에서 본 것과 상당히 비슷하다. 따라서 각 영역을 Union-Find 구조체로 표현한다. 처음 시작할 때 픽셀마다 이 구조체를 하나씩 할당한다.

모든 영역에 대한 통계를 계산하는 통계 함수를 구현할 수 있는가? 이때 각 루트마다 픽셀 개수와 모든 값의 합을 담은 또 다른 배열(이 도전에서 사용하는 세 번째 배열)을 사용해야 한다.

각 영역에 대해 서로 합치는 기준을 구현할 수 있는가? 두 영역의 평균값의 차이가 너무 크지 않은지 검사한다. 가령 명암 값이 5를 넘지 않는지 검사한다.

한 줄씩 합치는 전략을 구현할 수 있는가? 즉, 이미지의 한 줄을 구성하는 픽셀마다 그 영역이 왼쪽이나 위쪽으로 합쳐져야 하는지 검사할 수 있는가?

더 이상 변화가 없을 때까지 한 줄씩 반복하도록 할 수 있는가? 다시 말해 결과로 나오는 영역이나 집합을 이웃 영역과 비교한 결과가 모두 음수로 나올 때까지 반복하게 만들 수 있는가?

이 단계까지 오면 이미지 세그먼테이션을 수행하는 함수를 모두 만들었을 것이다. 이제 다양한 주제와 크기로 된 이미지를 대상으로 이 함수를 실행해 보기 바란다. 또한 합치는 기준을 평균 거리 5가 아닌 다른 값으로도 실행해 보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.