SVD: Singular Vector Decomposition에 대해 다룬다. 각 수식이 어떤 의미를 가지고, 이미지 압축에 어떻게 사용되는지 설명한다. 본 글을 이해하기 위해 아래 개념을 이해하고 있어야 한다.Vector: 크기와 방향을 가지는 양으로, 2차원 공간의 벡터는 $\vec{v}=\begin{bmatrix}u_1 & u_2\end{bmatrix}$와 같이 표현한다. 본문에서는 $v$ 형태로 표기한다.Inversed matrix: $A$에 대한 역행렬로 $A^{-1}$로 표기하며, $A^{-1}A=I$라는 특징을 가진다.Orthogonal matrix: 모든 column 벡터가 직교하는 행렬로, $AA^T=A^TA=I$라는 특징을 가진다. 동시에 $A^T=A^{-1}$이다.Diagonal ma..
엣지(edge) 검출은 객체의 경계를 찾는 방법으로 객체 판별 전처리 과정으로 사용한다. 본 글은 대표적인 엣지(이하 경계) 검출에 필요한 수학적 배경과 알고리즘에 대해 설명한다.미분과 변화량경계 검출의 핵심은 변화를 찾는 것이다. 객체와 배경은 밝기 차이가 있을 것이라고 가정한다. 밝기 변화가 일정 수준을 넘어가면 경계로 예측한다. 이미지가 복잡하면 잘못 검출될 가능성도 있지만 합리적인 아이디어라고 볼 수 있다.그렇다면 변화를 정의해야 한다. 수학에서 변화율은 미분으로 정의한다. 연속 함수 $f(x)$에 대해 미분은 아래와 같다.$$f'(x) = \cfrac{df}{dx}=\lim_{\bigtriangleup x \to 0}\cfrac{f(x+\bigtriangleup x)-f(x)}{\bigtrian..
이미지 행렬의 이동, 확대, 축소 등 기하학적 변환에 대해 다룬다. 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 = ..
본 글은 아래 환경에서 테스트한 코드로 작성했다.OS: Window 11Python: 3.13.0GCC(MinGW-W64): 13.3.0Go: 1.23.3추가로 MacOS에서도 동일한 코드로 작동하는 것을 확인했다.개요언어(C, Go)를 공유 라이브러리로 빌드한다.컴파일된 라이브러리를 ctypes로 불러온다.사용할 함수의 파라미터 및 리턴 자료형을 정의한다.함수를 호출한다.ctypesctypes는 dll 또는 공유 라이브러리를 불러올 수 있는 Python 내장 라이브러리다. C와 같이 외부 언어로 작성한 코드를 Python에서 실행하도록 도와준다.C to PyC를 공유 라이브러리로// lib.cfloat add_float(float a, float b) { return a + b;}실수를 더하는 간..