컨볼루션은 도함수 계산, 가장자리 감지, 흐림 적용 등과 같은 많은 작업에 사용되며 이 모든 작업은 '컨볼루션 커널'을 사용하여 수행됩니다. 컨볼루션 커널은 매우 작은 행렬이며 이 행렬에서 각 셀에는 숫자와 앵커 포인트가 있습니다.
앵커 포인트는 이미지에 대한 커널의 위치를 아는 데 사용됩니다. 이미지의 왼쪽 상단에서 시작하여 각 픽셀을 순차적으로 이동합니다. 커널은 이미지의 각 위치에서 몇 픽셀과 겹칩니다. 겹쳐진 각 픽셀은 곱해진 후 더해집니다. 그리고 그 합이 현재 위치의 값으로 설정됩니다.
컨볼루션은 이미지의 각 요소가 로컬 이웃에 추가된 다음 커널에 의해 가중치가 부여되는 프로세스입니다. 이는 수학적 컨벌루션의 한 형태와 관련이 있습니다.
Convolution에서 행렬은 전통적인 행렬 곱셈을 수행하지 않지만 *로 표시됩니다.
두 개의 3x3 행렬이 있다고 가정합니다. 하나는 커널이고 다른 하나는 이미지 조각입니다. 컨볼루션에서는 커널의 행과 열을 뒤집은 다음 곱하고 합산하는 작업을 수행합니다. 행렬 중앙, 즉 이미지의 [2,2]에 존재하는 요소는 이미지 행렬의 조합에 가중치를 부여하고 가중치는 커널에 의해 제공됩니다. 마찬가지로, 행렬의 다른 모든 요소에 가중치가 부여된 다음 가중치가 계산됩니다.
다음은 컨볼루션 프로세스를 설명하는 의사 코드입니다.
자바의 인터페이스
For each image row in input image: For each pixel in image row: Set accumulator to zero For each kernel row in kernel: For each element in kernel row: If element position corresponding* to pixel position then Multiply element value corresponding*to pixelvalue Add result to accumulator Endif Set output image pixel to accumulator
여러 개의 for 루프를 사용하여 컨볼루션을 계산할 수 있습니다. 그러나 for 루프를 사용하면 반복 계산이 많이 발생하고 이미지 크기와 커널 크기도 증가합니다. Discrete Fourier Transform 기술을 사용하면 컨볼루션 계산을 신속하게 수행할 수 있습니다. 이 기술에서는 전체 컨볼루션 연산이 간단한 곱셈으로 변환됩니다.
컨볼루션에서는 커널이 2차원이기 때문에 커널이 가장자리나 모서리 근처에 있을 때 문제가 발생합니다.
이러한 문제를 극복하려면 다음 작업을 수행할 수 있습니다.
- 무시할 수 있는 것
- 가장자리 근처에 추가 픽셀을 만들 수 있습니다.
다음과 같은 방법으로 추가 픽셀을 만들 수 있습니다.
- 가장자리 픽셀이 중복되었습니다.
- 가장자리 반사
- 픽셀은 반대쪽 끝에서 복사할 수 있습니다.