해당 포스트는 "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; }
위 두 소스의 결과로 출력되는 값은 서로 같다.
'OpenCV 프로그래밍' 카테고리의 다른 글
getDerivKernels, Sobel, Scharr, Laplacian, LoG (0) | 2017.06.26 |
---|---|
filter2D, boxFilter, bilateralFilter, blur, GaussianBlur (0) | 2017.06.25 |
OpenCV 히스토그램 생성, 평활화, 역투영 (0) | 2017.06.24 |
OpenCV 반전/임계값, 선형, 로그, 거듭제곱 변환 영상 (0) | 2017.06.24 |
OpenCV 선형대수 함수 (0) | 2017.06.23 |