Linear filters
filter의 값들과 선형결합으로 주어진 식을 픽셀 값으로 사용하는 경우를 말한다.
근데, 이미지에 필터를 씌워서 계산하면, 결과적으로 가장자리가 빈다. 이러한 가장자리 값들을 구하고 싶다면?
특별한 filter가 있는데, important intuition이다.
특정 모양의 filter가 있으면, 그 filter를 순회시키면서 가장 필터와 비슷한 영역을 찾아내는 것.
그 필터를 convolution kernel이라 하고, 그 결과를 convolution output이라 하는데,
convolution output의 값은, 필터와 비슷한 영역이 가장 높고, 안 비슷하면 낮다.
padding을 하면 된다! 이미지 밖에 new값들을 만들어주는 것.
보통 zero 패딩을 하는데, 여러 종류가 있긴 함.
reflection(반사 - 가장자리를 기준으로 새로 만드려는 픽셀의 반대부분의 값을 가져옴)
replication(복제 - 가장자리를 똑같이 써줌)
이렇게 패딩 후 필터를 적용시키고, 패딩된 부분을 다시 잘라주면 내가 원하는 이미지로 완성!
correlation : filtering 식과 같음.
convolution : filtering을 할 때, 반사되는 위치와 곱해짐.
여기서 correlation의 결과는 convolution으로 모두 만들기 가능.
CNN, convolutional neural networks 는 image filtering의 결과로 이해하면 된다.
2D convolution은 2차원 필터를 곱하는 것,
3D convolution은 3차원 필터를 곱하는 것인데, 여기서 channel 수는 input의 channel 수와 같다.
이러한 filtering을 이용해서 이미지를 좀.. 흐릿하게 만들거나, 선명하게 만들 수가 있다.
1. 흐릿하게
smoothing이라고 불리는데,
쉽게 쓰려면 average filter, 즉 모든 픽셀 값을 1로 한 필터를, 필터의 픽셀 수로 나눈 행렬을 필터로 쓰는 것.
이런 필터는 만약 input image가 다 비슷한 색만 있다면 별로 안 변하지만,
흰+검 이 섞여있는 image라면 회색이 된다.
이런 avg filter말고 또다른 필터가 있다.
filter가 적용되는 부분의 중앙이 좀 더 중요한 것 같다고 느끼는데, 이럴 때는 중앙 값을 높이면 된다.
이렇게 중앙값만 높인 필터는, box filter라고 불리며, 이로 필터링을 진행한 경우 결과 이미지에 박스가 보인다.
더 정확히 smoothing을 하려면 가우시안 필터를 쓰면 된다. 중앙값부터 퍼지는 곳들의 값들을 고려해보면, 정규분포 모양이 된다.
만약 시그마, 즉 분산의 값을 높인다면, 더 퍼진 정규분포 모양이 될 것이기에, 픽셀값끼리 더 많이 섞이게 된다. 더 흐릿해진다는 뜻이다.
근데 이런 정규분포 필터는.. 픽셀로 나타낸 것이기에 이산형이라 필터의 값들을 다 더해도 1이 되진 않는다.
하지만 최대한 합이 1이 되는 것이 좋음..
따라서 전체 합인 sum으로 이 필터를 나눠줘서 평균으로 만들어준다.
box filter보다 smooth하다.
이 가우시안 필터에서 중요한 것은 sigma와 filter 크기이다.
sigma에 따라서 분포 모양이 바뀌고,
그 모양에 따라 filter를 얼마나 할지 정한다.
예를 들어, sigma가 a일 때, 이 가우시안 분포는 15*15 크기의 filter로도 잘 표현할 수 있고, 이 크기를 넘어가면 보통 0이라 굳이 필요없고 연산량만 늘린다면, 30*30 크기의 filter를 사용할 이유가 없어지는 것이다. sigma를 고정한 상태에서, 적절한 filter size를 넘어간다면, 결과값은 계속 동일할 것이고, 불필요한 연산량만 늘어난다.
이러한 filtering은 denoising의 역할도 할 수 있다. 주변 값과 섞어 흐릿하게 보이게 하기 때문에!
filter의 크기가 크면 클수록 섞이는 픽셀이 많기 때문에 더 흐릿해진다.
2. 선명하게
대조를 높이면 됨.
우선, filter의 합을 1로 하는 것이 좋다고 했음. 이걸 고려해서 생각한다.
대조를 높이기 위해서는, box filter를 만들어 중앙값을 2, 3.. 등을 곱해주고, 테두리 값들을 0을 곱해준다.
그럼 중앙값만 더 튀게 보이겠지?
근데 filter요소의 합을 1로 해야 하는데, 그러려면, 새로운 같은 크기의 평균 필터를 만들어준다.
예를 들어, box filter의 테두리는 0, 중앙값은 2면, 현재 필터 요소의 총합은 2이므로, -1을 해줘야 한다.
그럼 평균필터를 만들면 이 필터의 요소의 총합은 1이니깐, 이 필터를 box filter에서 빼주면 된다.
근데 만약에, box filter의 중앙값을 3, 4 이렇게 높인다면?
최종 filter 요소의 합이 2, 3이 되는데,
그렇다면 전반적인 밝기가 2, 3배가 될 것이라고 생각할 수 있다.
만약 Unsharp masking을 하고 싶다?
그럼 그 단계는,
이미지를 흐릿하게 만들고 - 흐릿해진 정도(차이)를 어떠한 변수 g에 저장 후 - 결과 이미지에는 원본 이미지 + k*g 를 해준다.
만약 노이즈가 있다면, sharpening을 하면 안좋음.
Separability
보통 kernel은 그대로 쓰는데, 만약.. 특별한 경우라면, 이 kernel을 벡터@벡터.T 로 나타낼 수 있다.
ex)
이러한 행렬을 [1 2 1] 열벡터와 행벡터의 곱으로 나타낼 수 있다.
이 식은, 윗부분은 Gaussian을 2D로 나타낸 것,
밑의 식은 Gaussian을 1D의 곱으로 나타낸 것이다.
이렇게 하는 이유는, 연산량을 줄이기 위해서이다.
원래의 kernel대로 사용한다면, 1픽셀 당 곱셈 횟수가 K^2이므로, 전체 곱횟수가 K^2 * N^2이다.
하지만 나뉜 kernel을 사용한다면, 각 픽셀 당 곱셈 횟수가 K이고, 전체 곱횟수가 K * N^2 이다. (이걸 열, 행 이렇게 두 번 하면 됨) --> 결과적으로 총 연산량은 2*K*N^2
즉, K가 1, 2일 때를 제외하고, separable filtering이 계산량이 훨씬 적다.
'AI > 컴퓨터비전' 카테고리의 다른 글
Segmentation (1) | 2024.06.16 |
---|---|
Morphological (0) | 2024.06.15 |
edge detection (nms 고치기) (0) | 2024.06.15 |
image resizing (0) | 2024.06.15 |
Image 기초 (0) | 2024.06.15 |