11.3.2 룩업 테이블을 이용한 허프 변환의 구현
허프 변환을 구현하기에 앞서 먼저 직선의 방정식 파라미터를 저장할 클래스를 하나 만들어보자. 소스 11-7은 극좌표계 형태로 직선의 방정식을 표현할 때 필요한 두 개의 파라미터와 허프 변환 시 사용되는 축적 배열 값을 멤버로 갖는 클래스 설계를 보여준다. IppLineParam 클래스 정의에서 실수형 변수 rho는 직선의 방정식에서 ρ를 의미하며, 또 다른 변수 ang는 θ를 의미한다. 멤버 변수 vote는 축적 배열에서 누적된 값을 저장한다. 이 클래스의 정의를 IppFeature.h 파일 상단에 추가하도록 하자.
class IppLineParam { public: double rho; double ang; int vote; public: IppLineParam() : rho(0), ang(0), vote(0) {} IppLineParam(double r, double a, int v) : rho(r), ang(a), vote(v) {} };
허프 변환을 구현할 때 크게 신경을 써야 할 부분은 파라미터 공간에서 사용할 축적 배열의 크기를 결정하는 일이다. 파라미터 공간에서의 ρ와 θ는 실수형으로 정의된다. 그러나 C/C++로 축적 배열을 구현할 경우, 배열의 인덱스index를 정수형으로 사용하기 때문에 ρ와 θ의 값을 적당한 크기로 양자화quantization해서 사용해야 한다. 다시 풀어서 설명하면, θ의 값은 0~π 사이의 실숫값을 갖는데, 이 값을 몇 개의 구간으로 나눌 것인지를 결정하는 것이다. 배열의 크기를 크게 잡으면 미세한 실숫값의 변화도 감지할 수 있는 반면에, 프로그램의 연산 시간이 길어질 수 있다. 배열의 크기를 작게 잡으면, 프로그램 수행 시간은 빨라지지만 정확도는 떨어지게 된다. 그러므로 적정한 크기의 배열을 선택하는 것이 중요하다.
이 책에서는 ρ의 최댓값을 으로 설정하고, θ의 범위를 0~360으로 설정하여 허프 변환을 구현한다. 여기서 M과 N은 영상의 가로 및 세로 픽셀의 크기를 의미한다. 0~π 사이의 값을 갖는 θ를 360등분으로 나누어 사용하기 때문에 실제 계산에서는 0.5° 크기 단위로 각도를 양자화한 셈이 된다. 이 정도 크기로 양자화를 하면, 256×256 크기의 영상에서는 비교적 정확한 직선을 찾아낼 수 있다.