해당 포스트는 "OpenCV로 배우는 영상 처리 및 응용", "C++ API OpenCV 프로그래밍" 책의 내용을 요약한 것이다.



※ 경계값 채우기

이웃을 정의하는 필터 W(x,y)의 크기가 3*3이면, 첫 번째와 마지막 행과 열에서는 이웃 중 일부가 영상 및 행렬을 벗어나게 된다. 따라서 경계에서 벗어나는 이웃을 처리하는 방법이 있어야 한다. 일반적으로는 0으로 채우거나 경계에 있는 값을 확장 복사하여 사용한다.


- void copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value = Scalar())

: 영상 src를 dst에 복사하되 top, bottom, left, right에 명시된 만큼 각 부분을 확장한다. 확장된 행렬 요소 안에는 borderType에 따라서 value 값이 들어가거나 경계에 있는 값이 복사된다. 만약 borderType=BORDER_CONSTANT 라면 value 값으로 채워 넣는다. 다른 borderType 들은 src의 상하좌우의 경계 값을 특정 규칙에 따라 복사하여 채운다. 


- int borderInterpolate(int p, int len, int borderType)

: 이 함수는 copyMakeBorder 과 달리 결과행렬에 경계값 채운 결과가 저장되지 않는다. borderType에 따라 p위치에 대한 원본 영상의 좌표를 계산한다. len은 행렬의 열 또는 열의 길이다. 다음의 예를 보자.  

int border = 1; Mat B; copyMakeBorder(A, B, border, border, border, border, BORDER_REPLICATE); cout << "B = " << B << endl;


for (int y = -border; y<A.rows + border; y++) { for (int x = -border; x<A.cols + border; x++) { float val = A.at<uchar>(borderInterpolate(y, A.rows, BORDER_REPLICATE), borderInterpolate(x, A.cols, BORDER_REPLICATE)); cout << val << ", "; } cout << endl; }

위 두 소스의 결과로 출력되는 값은 서로 같다.

+ Recent posts