이미지 행렬의 이동, 확대, 축소 등 기하학적 변환에 대해 다룬다. C++로 작성한 OpenCV 코드를 사용한다. 원본 이미지 좌표는 $(x, y)$로, 변환된 이미지 좌표는 $(x',y')$로 표현한다. 간결한 코드를 위해 네임스페이스를 생략하며, 이미지를 읽는 과정도 생략한다. 코드에서 img는 원본 이미지, dst는 변환된 이미지이다.OpenCV는 warpAffine과 perspectiveTransform 메서드를 지원한다.warpAffine: 어파인 변환 행렬을 이용perspectiveTransform: 투시 변환 행렬을 이용이동 변환이동(translation) 변환은 이미지 좌표를 x, y 방향으로 이동(shift)한다. 평행 이동은 간단한 덧셈으로 구현 가능하다.$$x' = x + \bigtr..
본 글은 이미지 간 덧셈과 뺄셈에 대해 다룬다. C++로 작성한 OpenCV 코드를 활용한다.오버랩먼저 이미지 간 덧셈에 대해 살펴보자. 두 이미지($X$)를 더하면 이미지가 겹쳐진 형태로 표현된다. 하지만 단순히 더하면 값이 범위를 넘어서면서 정보가 손실된다. 이미지 픽셀은 0 ~ 255 범위를 가지기 때문에 255를 넘는 정보는 모두 255로 표현된다. 참고로 정보가 손실된다는 표현이 이해되지 않는다면 saturate에 대해 읽어보자.따라서 값이 커지는 것을 막기 위해 가중합(weighted sum)을 사용한다.$$X = \sum{X_i \cdot w_i} + b$$예를 들어, 이미지 $X_1$와 $X_2$를 더한다면 $0.5X_1 + 0.5X_2$를 할 수 있다. $X_1$ 이미지를 강조하고 싶다면..
이미지 명도(brightness)와 대비(contrast)를 조절하는 수치 연산을 설명한다. C++로 작성한 OpenCV 코드를 사용한다.명도명도는 이미지의 밝기이다.$$X = saturate(X + n)$$grayscale 이미지($X$)는 0 ~ 255 값으로 이루어진 2차원 행렬이다. 0에 가까울수록 어둡고, 255에 가까울수록 밝다. 따라서 행렬 각 원소에 대해 값을 더하거나 빼는 방법을 이용해 밝기를 조절한다. 여기서 saturate 연산은 값이 0보다 작으면 0으로, 255보다 크면 255로 범위를 조정하는 함수다. 픽셀 값은 unsigned char로 항상 0 ~ 255 사이 값을 가지기 때문에 반드시 saturate 연산을 거쳐야 한다.using namespace cv;Mat src = ..