Search
Duplicate

OpenCV로 배우는 영상 처리 및 응용/ 영역 처리

회선 (Convolution)

공간 영역의 개념과 회선

영상 처리에서 ‘영역’에 대한 하나의 의미는 두 개의 다른 범위(domain)의 구분이다.
하나는 공간 영역(spatial domain)이고, 다른 하나는 주파수 영역(frequency domain)이다.
공간 영역은 영상들이 다루어지는 화소 공간을 의미하는데, x, y 차원의 2차원 공간을 말한다.
다른 하나는 영역 기반 처리(area based processing)라는 표현에서 사용하는 영역이다.
이는 화소 기반 처리와 상반되는 의미로서, 화소점 하나 하나의 개념이라기 보다는 화소가 모인 특정 범위(영역)의 화소 배열을 의미한다.
화소 기반 처리가 화소값 각각에 대해 여러 가지 연산을 수행하는 것이라면, 공간 영역 기반 처리는 마스크(mask)라 불리는 규정된 영역을 기반으로 연산이 수행된다. 이러한 이유에서 공간 영역 기반 처리를 마스크 기반 처리라고도 한다.
마스크 기반 처리는 마스크 내의 원소값과 공간 영역에 있는 입력 영상의 화소값들을 대응되게 곱하여 출력화소값을 계산하는 것을 말한다. 이러한 처리를 하는 과정을 모든 출력화소값에 대해 이동하면서 수행하는 것을 회선(convolution)이라고 한다.
이때 입력 영상에 곱해지는 마스크는 커널(kernel), 윈도우(window), 필터(filter) 등의 용어로 불려진다.
위 그림은 3×3 크기의 마스크로 회선을 수행하는 과정을 표현한 것으로, 출력 화소 O22O_{22}는 대응되는 위치에 있는 입력화소 I22I_{22}와 마스크 크기만큼의 주위 화소들을 이용해서 계산된다.
즉 마스크의 각 원소가 같은 위치의 입력화소와 곱해지며, 이 곱한 값들을 모두 더해서 출력 화소가 계산된다.
계속적으로 출력화소 O23O_{23}은 입력 영상에서 마스크를 한 화소 오른쪽으로 이시킨 후에 대응되는 입력화소들과 곱하여 계산된다.
같은 방법으로 입력 영상의 모든 화소에 대해 마스크를 이동시켜 곱하고, 그 값들을 모두 더해서 해당 위치의 출력화소가 계산된다.
결과적으로 회선으로 생성되는 영상은 마스크의 원소 값에 따라 결정된다. 즉, 입력 영상의 각 화소의 위치에서 마스크의 크기의 주변 화소들을 마스크 원소의 비율만큼 반영하는 것이다.
이 마스크의 원소를 어떻게 결정하느냐에 따라 결과 영상이 드라마틱하게 달라진다.

블러링(Blurring)

블러링은 영상에서 화소값이 급격하게 변하는 부분들을 감소시켜 점진적으로 변하게 함으로써 영상이 전체적으로 부드러운 느낌이 나게 하는 기술이다.
경우에 따라 스무딩(smoothing)이라고 하는 경우도 있다.
화소값이 급격하게 변하는 것을 점진적으로 하는 방법은 회선을 이용한 필터링을 이용하는 것이다.
마스크를 아래 그림과 같이 모든 원소의 값을 같게 구성하여 회선을 수행하면 블러링이 적용된다.
이때 마스크의 전체 원소의 합은 1이 되어야 입력 영상의 밝기가 유지된다.
아래 그림은 회선을 통한 블러링을 설명하기 위한 내용이다.
아래 그림에서 O22O_{22}O23O_{23}의 계산에서 입력 영상 중 6개 화소가 동일하며, 나머지 3개 화소만 다르다.
이웃하는 두 출력화소는 마스크 크기 내에서 입력화소의 2/3가 공통 부분이고 블러링 마스크의 원소 값이 모두 같기 때문에 입력화소가 같은 비율로 출력화소에 반영된다.
따라서 입력화소의 공통부분이 같은 비율로 반영되기 떄문에 출력 영상에서 이웃하는 화소들이 비슷한 값을 갖게 된다.

샤프닝(sharpening)

블러링이 이웃 화소의 차이를 감소시켜서 부드럽게 만드는 것이라면, 샤프닝은 이웃 화소끼리 차이를 크게 해서 날카로운 느낌이 나게 만드는 것이다.
이렇게 함으로써 영상의 세세한 부분을 강조할 수 있으며 경계 부분에서 명암대비가 증가되는 효과를 낼 수 있다.
입력 영상의 화소와 출력 영상의 화소가 마스크의 중심 위치에서 대응된다. 이 마스크의 중심 위치의 계수를 중심계수라고 한다.
마스크 중심계수의 비중이 크면 출력 영상은 입력 영상의 형태를 유지하게 된다. 추가적으로 주변 계수들을 중심계수와 값의 차이를 크게 만들면 샤프닝이 수행된다.
여기서 마스크 원소의 전체 합이 1이 되어야 입력 영상의 밝기가 손신 없이 출력 영상의 밝기로 유지된다. 마스크 원소의 합이 1보다 작으면 출력 영상의 밝기가 입력 영상보다 어두워지며, 1보다 크면 입력 영상보다 더 밝아진다.
따라서 중심계수는 1보다 훨씬 크게 구성하며, 주변 화소는 비중을 감소시킬 수 있도록 음수 값을 갖게 한다. 그리고 전체 원소의 합은 1이 되도록 구성하면 샤프닝 필터가 완성된다. 아래 그림은 이와 같은 조건에 부합하는 샤프닝 마스크의 예이다.

에지(Edge) 검출

영상처리에서 에지는 윤곽선 혹은 경계선의 의미를 갖는다. 이 윤곽선은 객체에서 크기, 위치, 모양을 인지할 수 있으며, 그 방향성을 탐지할 수 있다.
따라서 에지 검출은 영상 처리에서 아주 중요하며 기본적인 처리 분야로 다루어진다.
위 그림은 영상의 특정 지점(40, 250)에서 가로로 50개의 화소를 가져와서 그 화소값을 그래프로 나타낸 모습이다.
그래프에서 원으로 표시한 부분들을 보면 화소값에서 급격하게 변하여 그래프가 꺾이는 것을 볼 수 있는데, 28번째 픽셀에서 화소값이 급격하게 낮아지며, 32번째 픽셀 주위에서는 다시 급격하게 높아진다.
이렇게 화소값 그래프에서 급격하게 꺽이는 부분을 영상에서 보면 모서리나 윤곽선 혹은 경계 부분인 것을 알 수 있다.
에지 검출(edge detection)이란 에지에 해당하는 화소를 찾는 과정으로 그 방법으로는 가장 간단하게 이웃하는 화소의 차분을 이용하여 그 차분이 특정 임계값 이상인 곳을 에지로 지정하는 것이다.
또한 에지는 마스크를 이용하여 계산할 수도 있는데, 1차 미분 마스크나 2차 미분 마스크를 사용하여 회선을 수행하는 것이다.

차분 연산을 통한 에지 검출

단순하고 빠른 에지 검출 방법으로 유사 연산자와 차 연산자를 이용한 방법이 있다.
유사 연산자는 중심화소에서 각 방향의 주변 화소와 차분을 계산하고, 그 중에서 가장 큰 값을 출력화소로 결정하는 방법이다. 아래 그림에서 보듯 8방향의 차분을 계산해야 한다.
반면 차 연산자는 중심화소를 배제하고 주변 화소의 상하 차분, 좌우 차분, 그리고 대각선 차분을 계산하고 그 중에서 가장 큰 값을 출력 화소로 결장하는 방법이다.
회선의 방법과 유사하게 입력 영상의 해당 화소에 마스크를 위치시키지만 화소값과 마스크 원소를 곱하는 것이 아니라 마스크 범위의 입력 화소들 간에 차분을 계산한다.
차 연산자의 경우 중심화소를 배제시켰기 때문에 4번의 차분만 계산하여 속도 면에서 유리하다.
위 그림은 차 연산자를 이용한 에지 검출 예제이다. 여기서 반복을 통해서 원소의 대각선 방향 차분(start-end)을 구하기 위해 mask 벡터를 도입해서 그림과 같이 계산한다.

1차 미분 마스크

영상의 특정 좌표에서 가로 방향(혹은 세로방향)으로 화소값들을 구성했을 때, 결과 그래프에서 밝기의 변화를 파악할 수 있다.
에지가 화소의 밝기가 급격히 변하는 부분이기 때문에 함수의 변화율을 취하는 미분 연산을 이용해서 에지를 검출할 수 있다.
영상에서 밝기의 변화율을 검출하는 방법은 밝기에 대한 기울기(gradient)를 계산하는 것이다. 현재 화소에서 밝기의 기울기를 계산하고, 이 기울기의 크기를 구하면 에지가 된다.
그러나 디지털 영상은 연속이 아닌 이산된 데이터이기 때문에 엄밀한 의미에서 미분 연산을 할 수 없다. 그래서 다음과 같은 수식으로 근사하여 계산한다.
G[f(x,y)]=[GxGy ]=[f(x,y)δxf(x,y)δy ]G[f(x, y)] = \left[ \begin{array}{rr} G_{x} \\ G_{y}  \end{array} \right] = \left[ \begin{array}{rr} {\partial f(x, y) \over \delta x} \\ {\partial f(x, y) \over \delta y}  \end{array} \right]
Gx=f(x+dx,y)f(x,y)dxf(x+1,y)f(x,y),(dx=1)G_{x} = {f(x + dx, y) - f(x, y) \over dx} \fallingdotseq f(x+1, y) - f(x, y), (dx = 1)
Gy=f(x,y+dy)f(x,y)dyf(x,y+1)f(x,y),(dy=1)G_{y} = {f(x, y + dy) - f(x, y) \over dy} \fallingdotseq f(x, y+1) - f(x, y), (dy = 1)
G[f(x,y)]Gx2+Gy2Gx+GyG[f(x, y)] \fallingdotseq \sqrt{G_{x}^{2} + G_{y}^{2}} \approx |G_{x}| + |G_{y}|
θ=tan1(GyGx)\theta = tan^{-1}({G_{y} \over G_{x}})
먼저 2차원 공간 상의 한 화소에서 수평 방향과 수직 방향으로 각각 미분한다. 이를 편미분이라 한다.
그리고 각 방향의 편미분을 한 화소단위 (dx = 1, dy = 1)의 차분으로 근사한다.
다음으로 각 방향의 차분을 이용해서 기울기의 크기를 계산한다. 이 크기가 에지의 강도가 된다.
여기서 계산 복잡도를 줄이기 위해 제곱과 제곱근 대신, 절댓값을 사용하기도 한다. 또한 역탄젠트(arctan) 함수에 가로 방향과 세로 방향 차분을 적용하면 에지의 방향을 계산할 수도 있다.
이러한 1차 미분 공식을 영상에 구현하는 쉬운 방법이 1차 미분 마스크로 회선을 적용하는 것이다.
마스크의 중심 위치의 입력 화소가 f(x, y)일 때 주변 화소의 위치를 보면 위 그림과 같다.
마스크 원소를 (a)와 같이 f(x, y), f(x, y+1) 위치에 -1과 1을 구성하여 회선을 수행하면, 회선의 내부 계산 수식이 f(x, y+1) – f(x, y) 이 되어서 y 방향 미분인 GyG_{y}와 같은 결과가 된다.
또한 (b)와 같이 f(x, y), f(x+1, y) 위치에 -1과 1을 구성하여 회선을 수행하면, 회선 수식이 f(x+1, y) – f(x, y)이 되어서 x 방향 미분인 GxG_{x}가 적용된다.
이렇게 회선의 수식을 이용해서 차분을 계산할 수 있도록 마스크의 원소를 구성하면 1차 미분 마스크가 된다. 이 마스크를 적용해서 입력 영상에 회선을 수행하면 에지 검출이 가능하다. 이때 마스크 계수의 합은 0이 되어야 한다.
이 외에도 다양한 1차 미분 마스크가 있으며 대표적으로는 소벨(Sobel), 프리윗(Prewitt), 로버츠(Roberts) 등이 있다.

로버츠(Roberts) 마스크

로버츠 마스크는 아래 그림과 같이 대각선 방향으로 1과 -1을 배치하여 구성된다. 나머지 원소의 값이 모두 0이어서 다른 1차 미분 마스크에 비해 수행 속도가 빠르다.
그리고 한 번만 차분을 계산하기 때문에 차분의 크기가 작고, 이로 인해 경계가 확실한 에지만을 추출하며, 잡음에 매우 민감하다.

프리윗(Prewitt) 마스크

프리윗 마스크는 로버츠 마스크의 단점을 보완하기 위해 고안되었다.
먼저 수직 마스크를 보자. 원소의 배치가 수직 방향으로 구성되어서 수직 마스크라고 하며, 결과 영상에서 에지의 방향도 수직으로 나타난다.
중심화소의 앞과 뒤 화소로 x 방향의 차분을 3번 계산하고, 다음 수평 마스크는 중심화소에서 위와 아래의 화소로 y 방향으로 차분을 3번 계산한다.
최종적으로 수직 마스크의 회선 결과와 수평 마스크의 회선 결과에 대해서 크기(magnitude)로 결과 영상(에지 강도)을 생성한다.
세 번의 차분을 합하기 때문에 로버츠 연산자에 비해 에지의 강도가 강하며, 수직과 수평 에지를 동등하게 찾는데 효과적이다.

소벨(Sobel) 마스크

소벨 마스크는 에지 추출을 위한 가장 대표적인 1차 미분 연산자이다. 마스크의 구성은 프리윗 마스크와 유사하지만, 중심화소의 차분에 대한 비중을 2배로 키운 것이 특징이다.

2차 미분 마스크

1차 미분 연산자는 밝기가 급격하게 변화하는 영역 뿐만 아니라 점진적으로 변화하는 부분까지 민감하게 에지를 검출하여 너무 많은 에지가 나타날 수 있다.
이를 보완하기 위한 방법으로 1차 미분에서 한 번 더 미분을 하는 방법이 2차 미분 연산이 있다.
2차 미분 연산자는 변화하는 영역의 중심에 위치한 에지만을 검출하며, 밝기가 점진적으로 변화되는 영역에 대해서는 반응을 보이지 않는다.
대표적인 방법으로는 라플라시안(Laplacian), LoG(Laplacian of Gaussian), DoG(Difference of Gaussian) 등이 있다.

라플라시안(Laplacian) 에지 검출

가장 대표적인 2차 미분 연산자로 라플라시안이 있다. 프랑스 수학자 라플라시안의 이름을 따서 지은 라플라시안은 함수 f에 대한 그래디언트의 발산으로 정의되며 수식으로 표현하면 다음과 같다.
Δf=2f=f\Delta f = \nabla^{2} f = \nabla \nabla f
영상은 2차원 좌표계이기 때문에 2차원 직교좌표계에서 라플라시안의 수식은 다음과 같다.
2f=2fx2+2fy2\nabla^{2} f = {\partial^{2} f \over \partial x^{2}} + {\partial^{2} f \over \partial y^{2}}
각 항을 디지털 영상의 화소로 근사하여 1차 미분한 결과에 한 번 더 미분을 수행하면 다음과 같이 정리할 수 있다.
2fx2=f(x+1,y)xf(x,y)x{\partial^{2} f \over \partial x^{2}} = {\partial f(x+1, y) \over \partial x} - {\partial f(x, y) \over \partial x}
=[f(x+1,y)f(x,y)][f(x,y)f(x1,y)]= [f(x+1, y) - f(x,y)] - [f(x,y) - f(x-1, y)]
=f(x+1,y)2f(x,y)f(x1,y)= f(x+1, y) - 2 \cdot f(x, y) - f(x-1, y)
2fy2=f(x,y+1)yf(x,y)y{\partial^{2} f \over \partial y^{2}} = {\partial f(x, y+1) \over \partial y} - {\partial f(x, y) \over \partial y}
[f(x,y+1)f(x,y)][f(x,y)f(x,y1)][f(x, y+1) - f(x,y)] - [f(x,y) - f(x, y-1)]
f(x,y+1)2f(x,y)f(x,y1)f(x, y+1) - 2 \cdot f(x, y) - f(x, y-1)
두 항을 더하면 라플라시안 마스크의 공식이 완성된다.
2f(x,y)=f(x1,y)+f(x+1,y)+f(x,y1)+f(x,y+1)4f(x,y)\nabla^{2} f(x, y) = f(x-1, y) + f(x+1, y) + f(x, y-1) + f(x, y+1) - 4 \cdot f(x, y)
3 x 3 크기의 마스크를 예로 라플라시안 마스크 공식에 적용하면 중심화소를 4배로 하고 상하좌우 화소를 중심화소와 반대 부호를 갖게 구성한다. 또한 마스크 원소의 전체 합은 0이 되어야 한다.
이런 방법으로 아래 그림 (a)와 같이 두 개의 마스크를 구성할 수 있으며, 4방향을 가지는 마스크가 된다.
경우에 따라서는 (b)와 같이 8방향으로 늘려 보면 모든 방향의 에지를 검출하고자 할 때도 있다. 중심계수의 값을 더 크게 하고 8방향의 모든 값을 반대 부호가 되게 하면 된다.

LoG와 DoG

라플라시안은 잡음에 민감한 단점이 있다. 그래서 잡음을 먼저 제거하고 라플라시안을 수행한다면 잡음에 강한 에지 검출이 가능할 것이다. 잡음 제거의 수단이 다양하게 있기에 미디언 필터링 혹은 최대/최솟값 필터링 등을 수행할 수 있다.
그러나 이런 방법들은 비선형 공간 필터링이기 때문에 먼저 잡음 제거 필터링을 수행하고, 다시 라플라시안을 수행해야 한다. 바로 속도에서 문제가 있는 것이다.
잡음을 제거하는 다른 방법으로 선형 공간 필터를 선택하여 회선을 하고, 그 후에 라플리사인 마스크로 회선하는 방법을 생각해 볼 수 있다. 이 경우 두 가지 모두 선형 필터링이기 때문에 다음 수식과 같이 단일의 마스크로 계산할 수 있다.
여기서 GσG_{\sigma}는 가우시안 스무딩 마스크이며, *는 회선을 의미한다.
Δ[Gσ(x,y)f(x,y)]=[ΔGσ(x,y)]f(x,y)=Logf(x,y)\Delta [G_{\sigma}(x, y) * f(x, y)] = [\Delta G_{\sigma}(x, y)] * f(x, y) = Log * f(x, y)
이렇게 구성한 마스크를 LoG(Laplacian of Gaussian)라고 한다. LoG 마스크를 수식에 따라 풀면 다음과 같다.
LoG(x,y)=1πσ4[1x2+y22σ2]e(x2+y2)2σ2LoG(x, y) = - {1 \over \pi \sigma^{4}} [1 - {x^{2} + y^{2} \over 2 \sigma^{2}}] \cdot e^{{-(x^{2} + y^{2}) \over 2 \sigma^{2}}}
이 수식으로 마스크의 계수를 구성하고, 회선을 수행하면 잡음에 강한 에지를 검출할 수 있다.
다만 수식에 따라 마스크 계수를 생성할 때 값의 범위가 너무 작은 관계로 전체 계수의 합이 0에 가까워지도록 스케일 조정이 필요하다.
LoG는 복잡한 공식에 의해 마스크를 생성해야 하며, 그에 따라 수행 시간도 많이 걸리게 된다. 이런 단점을 보완하여 LoG와 유사한 기능을 하면서 단순한 방법으로 구현하는 알고리즘이 바로 DoG(Difference of Gaussian)이다.
DoG는 가우시안 스무딩 필터링의 차이를 이용해서 에지를 검출하는 방식으로 공식은 아래와 같다.
DoG(x,y)=(12πσ12e(x2+y2)2σ12)(12πσ22e(x2+y2)2σ22)(σ1<σ2)DoG(x, y) = ({1 \over 2 \pi \sigma_{1}^{2}} \cdot e^{{-(x^{2} + y^{2}) \over 2 \sigma_{1}^{2}}}) - ({1 \over 2 \pi \sigma_{2}^{2}} \cdot e^{{-(x^{2} + y^{2}) \over 2 \sigma_{2}^{2}}}) (\sigma_{1} < \sigma_{2})
두 개의 표준 편차를 이용해서 가우시안 마스크를 만들고 그 차이가 DoG 마스크가 된다.
이 마스크로 회선을 수행하면 에지 검출이 가능하다. 여기서 각 표준 편차의 값을 조절함으로써 검출할 에지의 넓이를 조절할 수 있다.
또한 좀 더 쉽게 DoG를 구현하는 방법은 두 개의 표준 편차로 가우시안 마스크를 생성하여 회선을 수행하고, 그 결과 행렬들의 차분을 계산하는 것이다.

캐니 에지 검출

영상 내에서 잡음은 다른 부분과 경계를 이루는 경우가 많다. 그러다 보니 대부분의 에지 검출 방법이 이 잡음들을 에지로 검출하게 된다. 이런 문제를 보완하는 방법 중의 하나가 John F. Canny에 의해 개발된 캐니 에지(Canny Edge) 검출 방법이다.
캐니 에지 알고리즘은 일반적으로 다음 네 단계의 알고리즘으로 구성되어 있다.
1.
블러링을 통한 노이즈 제거(가우시안 블러링)
2.
화소 기울기(gradiant)의 강도와 방향 검출 (소벨 마스크)
3.
비최대치 억제(non-maximum suppression)
4.
이력 임계값(hysteresis threshold)으로 에지 결정
첫 단계에서 블러링은 5 x 5 크기의 가우시안 필터를 적용해서 수행한다. 여기서 블러링은 불필요한 잡음을 제거하기 위해서 수행하는 것이기 때문에 마스크의 크기를 다르게 하든지 혹은 다른 필터링을 적용해도 무관하다.
다음으로 화소 기울기(gradient) 검출에는 가로 방향과 세로 방향의 소벨 마스크로 회선을 적용하고 회선이 완료된 행렬 (Gx,Gy)(G_{x}, G_{y})를 이용해서 화소 기울기의 크기(magnitude)와 방향(direction)을 계산한다. 그리고 기울기의 방향은 4개 방향 (0, 45, 90, 135)로 근사하여 단순화 한다.
여기서 아래 그림과 같이 기울기의 방향과 에지의 방향은 수직을 이루는 것에 유의하자.
비최대치 억제(non-maximum suppression)라는 것은 현재 화소가 이웃하는 화소들보다 크면 에지로 보존하고 그렇지 않으면 에지가 아닌 것으로 간주해서 제거하는 것이다.
먼저 에지의 방향에 있는 이웃 화소는 비교할 필요가 없기 때문에 아래 그림과 같이 기울기의 방향에 있는 두 개의 화소를 비교 대상으로 선택한다.
그리고 현재 화소와 선택된 두 화소의 에지 강도를 비교하여 최대치가 아니면 억제되고, 최대치인 것만 에지로 결정한다.
비최대치를 억제하여도 에지가 아닌 것이 에지로 결정된 경우가 많이 존재한다. 잘못된 에지를 제거하는 쉬운 방법 중 하나가 임계값을 설정하고, 에지의 강도가 이 임계값보다 작으면 에지에서 제외하는 것이다.
그러나 이 방법은 임계값이 높으면 실제 에지도 제거될 수 있으며, 임계값이 낮으면 잘못된 에지를 제거하지 못하는 문제가 생길 수 있다.
캐니 알고리즘은 잘못된 에지를 제거하고 정확한 에지만을 검출하여 에지가 끊어지는 것을 방지하는 방법으로 이력 임계값 방법(hysteresis thresholding)을 사용한다.
이것은 두 개의 임계값 (Thigh,Tlow)(T_{\text{high}}, T_{\text{low}})을 사용해서 에지의 이력을 추적하여 에지를 결정하는 방법이다.
이 방법은 각 화소에서 높은 임계값 (Thigh)(T_{\text{high}}) 보다 크면 에지 추적을 시작한다.
그리고 추적을 싲가하면 추적하지 않은 이웃 화소들을 대상으로 낮은 임계값 (Tlow)(T_{\text{low}})보다 큰 화소를 에지로 결정하는 방식이다.
아래 그림의 예시를 보면 A 부분은 높은 임계값보다 높아서 에지로 결정된다. C 부분은 높은 임계값보다 낮지만 에지 추적에 의해서 에지로 결정된다.
반면 B 부분은 C 부분보다 에지의 강도는 높지만, 높은 임게값 보다 큰 이웃하는 부분이 없기 때문에 에지로 결정되지 않는다.
즉 낮은 임계값 이상인 에지들이 높은 임계값에서부터 연결되어 있다면 에지로 간주하는 것이다.

기타 필터링

최댓값/최솟값 필터링

최댓값/최솟값 필터링은 입력 영상의 해당 화소(중심화소)에서 마스크로 씌워진 영역의 입력화소들을 가져와서 그 중에 최댓값 혹은 최솟값을 출력화소로 결정하는 방법이다.
따라서 최댓값 필터링은 가장 큰 값인 밝은 색들로 출력화소가 구성되기 때문에 돌출되는 어두운 값이 제거되며, 전체적으로 밝은 영상이 된다.
최솟값 필터링은 가장 작은 값들인 어두운 색들로 출력화소가 구성되기 때문에 돌출되는 밝은 값들이 제거되며, 전체적으로 어두운 영상이 된다.
최댓값 필터링은 밝은 임펄스 잡음이 강조되며, 최솟값 필터링은 어두운 임펄스 잡음이 강조될 수 있다. 경우에 따라 높은 대조를 가진 영상에서 특징을 확대시키기 위한 기법으로 이용될 수 있다.

평균값 필터링

평균값 필터링은 마스크로 씌워진 영역의 입력화소들을 가져와서 그 화소들의 평균을 구하여 출력화소로 지정하는 방법이다.
마스크 영역의 화소값들을 평균하기 때문에 블러링의 효과가 나타난다.
입력 영상의 상하좌우 끝부분에 있는 화소들은 마스크를 씌웠ㅇㄹ 때 입력화소가 존재하지 않는 화소들이 있다.
3 x 3 마스크일 경우에는 상하좌우로 한 화소씩이 해당하며, 5 x 5 마스크일 경우에는 상하좌우 두 화소씩이 해당된다.
이 경우 배열 참조가 잘못되어 오류가 발생하기 때문에 추가적인 방법을 적용해서 출력화소를 결정해야 한다.
OpenCV에서도 cv::filter2D(), cv::blur(), cv::boxFilter(), cv::sepFilter2D()와 같은 필터링을 수행하는 함수들에서 상하좌우 경계부분의 화소값을 결정하는 방법으로 borderType 이라는 옵션 상수를 다음과 같이 정의해 두었다.
옵션 상수
설명
BORDER_CONSTANT
0
특정 상수값으로 대체
BORDER_REPLICATE
1
계산 가능한 경계의 출력화소 하나만으로 대체
BORDER_REFLECT
2
계산 가능한 경계의 출력화소로부터 대칭되게 한 화소씩 지정
BORDER_WRAP
3
영상의 왼쪽 끝과 오른쪽 끝이 연결되어 있다고 가정하여 한 화소씩 가져와서 지정

미디언 필터링

미디언 필터링은 중간값을 이용하기에 중간값 필터링이라고도 한다.
중간값 필터링 과정은 아래 그림과 같다.
먼저 입력 영상에서 해당 입력화소를 중심으로 마스크를 씌워 마스크 크기 내에 있는 입력화소들을 가져온다. 회선과는 다르게 마스크 계수는 필요하지 않고, 마스크의 크기만 필요하다.
그리고 마스크 내에 있는 화소들을 크기 순으로 정렬한다.
정렬된 화소값 중에서 중간 값을 취하여 출력 화소로 지정한다.
이와 같은 과정을 마스크를 이동하며 모든 입력솨호에 대해 수행해서 출력영상을 생성한다.
일정 영역에서 다른 화소들과 밝기가 심하게 차이가 나는 화소들은 임펄스(impulse noise) 잡음이나 소금-후추(salt & pepper) 잡음일 가능성이 높다.
미디언 필터링 과정에서 마스크 영역 내의 심하게 차이가 나는 화소들은 정렬로 인해서 최하위 값이나 최상위 값이 된다. 따라서 중간 값만이 출력화소로 지정되고, 나머지 값들은 출력화소로 지정되지 않고 제거된다.
이러한 이유로 미디언 필터링은 임펄스 잡음이나 소금-후추 잡음을 잘 제거해 준다. 또한 평균 필터를 이용한 필터링에 비하면 블러링 현상이 적다.
다만 마스크의 크기가 커지면 잡음의 제거 성능은 향상되지만, 정렬 알고리즘을 수행해야 하는 부담 때문에 수행 시간이 기하급수적으로 증가한다.
미디언 필터링은 보통 명암도 영상에서 효과적으로 수행된다.
RGB 컬러 공간에서는 3개 채널간의 상호 의존도가 매우 크다. 예컨대 한 채널에서는 특정 화소가 주위와 심한 차이를 보여서 제거되어도, 다른 채널에서는 같은 화소가 주위와 차이가 작아서 제거되지 않는 경우들이 생긴다. 이런 경우 RGB 조합이 맞지 않아서 오히려 잡음이 더 많아질 수도 있다.

가우시안 스무딩 필터링

스무딩(smoothing)은 영상의 세세한 부분을 회선을 통해서 부드럽게 하는 기법으로 블러링과 같은 의미이다.
스무딩 처리에 사용되는 대표적인 방법으로 가우시안 필터링이 있다. 가우시안 필터링은 가우시안 분포를 마스크의 계수로 사용해서 회선을 수행하는 것을 말한다.
가우시안 분표는 정규 분포(normal distribution)으로 특정 값의 출현 비율을 그래프로 그렸을 때, 평균에서 가장 큰 수치를 가지며, 평균을 기준으로 좌우 대칭의 형태가 나타나고, 좌우 양끝으로 갈수록 급격하게 수치가 낮아지는 종 모양의 형태를 보인다.
정규 분포를 평균(μ\mu)과 표준편차(σ\sigma)를 이용해서 함수식으로 표현하면 아래 수식과 같고, 이 수식에 따라 그래프를 그리면 아래 그림과 같다.
그래프에서 표준 편차가 커지면 그래프의 폭이 넓어지고 표준편차가 작아지면 폭이 좁하진다.
N(μ,σ)(x)=1σ2πexp((xμ)22σ2)N(\mu, \sigma)(x) = {1 \over \sigma \sqrt{2\pi}} exp(- {(x - \mu)^{2} \over 2 \sigma^{2}})
가우시안 분포를 회선 마스크로 적용하려면 2차원으로 구성해야 한다. x, y 좌표를 축으로 2차원 가우시안 분포 함수를 구성하면 다음의 수식과 같고 이것을 그래프로 표현하면 아래 그림과 같다.
N(μ,σx,σy)(x,y)=1σxσy2πexp[((xμ)22σx2+(yμ)22σy2)]N(\mu, \sigma_{x}, \sigma_{y})(x, y) = {1 \over \sigma_{x} \sigma_{y} \sqrt{2\pi}} exp[- ({(x - \mu)^{2} \over 2 \sigma_{x}^{2}} + {(y - \mu)^{2} \over 2 \sigma_{y}^{2}})]
이 가우시안 분포 값으로 마스크를 구성하여 회선을 수행하면 가우시안 스무딩을 수행할 수 있다.
단, 마스크 계수의 전체 합이 1이 되어야 입력 영상의 밝기를 유지할 수 있다.
여기서 표준편차를 변경하면 그래프에서 기둥의 폭을 조절할 수 있다. 즉, 마스크 계수의 구성을 표준편차로 조정하는 것이다.
표준편차가 클수록 평균의 높이는 낮아지고, 폭이 넓어진다. 따라서 생성되는 마스크는 블러링 마스크와 유사하게 만들어진다. 결과 영상에 중심화소와 비슷한 비중으로 주변 화소가 반영되기 때문에 흐림의 정도가 심해진다.
표준편차가 작아지면 구성된 마스크에서 중심계수의 값이 커지고, 주변 계수의 값은 작아진다. 이럴 경우 결과 영상에 중심화소의 비중이 커지기 때문에 흐림의 정도가 약화된다.

모폴로지(morphology)

모폴로지는 형태학이라는 뜻으로서 영상 처리에서는 객체들의 형태(shape)를 분석하고 처리하는 기법을 말한다. 이 형태학적 처리를 활용하여 영상의 경계, 골격, 블록 등의 형태를 표현하는데 필요한 요소를 추출한다.
영상 내에서 아주 작은 크기의 객체들은 잡음일 가능성이 높다. 이런 작은 크기의 객체는 그 크기를 더 깎아내서 제거하거나, 객체들을 분리하거나, 객체를 팽창하거나 할 때 필요한 것이 모폴로지이다.
모폴로지는 객체의 형태를 변형시켜야 하기 때문에 주로 이진 영상에서 수행된다. 대표적인 연산 방법으로는 침식 연산과 팽창 연산이 있으며, 이 두 개를 결합한 닫힘 연산과 열림 연산이 있다.

침식 연산(erosion operation)

침식 연산은 말 그대로 객체를 침식시키는 연산이다. 따라서 객체의 크기는 축소되고 배경은 확장된다. 객체의 크기가 축소되기 때문에 영상 내에 존재하는 잡음 같은 작은 크기의 객체들은 사라질 수도 있다.
이러한 현상을 이용해서 소금-후추(salt & papper) 잡음과 같은 임펄스(impulse) 잡음들을 제거한다. 영상 내에서 객체의 돌출부를 감소시키기 때문에 서로 닿는 물체를 분리할 때도 유용하게 사용할 수 있다.
위 그림은 이진 영상에서 침식 연산의 과정에 대한 내용이다.
입력 영상의 중심화소 주변에서 마스크 크기의 화소들을 가져와서 침식 마스크와 원소 간(element-wise)에 일치하는지를 비교한다. 여기서 침식 마스크의 원소가 1인 값에 대해서만 비교를 수행한다.
그림의 상단과 같이 입력 영상의 화소와 마스크 원소가 한 개의 화소라도 일치하지 않으면 출력화소는 검은색인 0이 된다.
반면 그 아래쪽의 그림과 같이 입력 영상의 화소와 마스크 원소와 비교해서 모두가 일치하면 출력화소는 흰색인 1이 지정된다.
마스크의 크기와 원소의 구성은 입력 영상의 형태에 따라 사용자가 조정하여 더 나은 결과를 생성할 수 있다.
아래 그림은 입력 영상에 값을 표시하고 침식 연산을 수행하여 결과 영상에 값을 표시한 예이다.
입력된 이진 영상에서 객체로 인식되는 흰색의 블록들은 그 경계부분이 깎여져서 출력 영상이 만들어진다.

팽창 연산(dilation operation)

팽창 연산은 객체를 팽창시키는 연산이다. 객체의 최외곽 화소를 확장시키는 기능을 하기 때문에 객체의 크기는 확대되고 배경은 축소된다. 또한 객체의 팽창으로 인해 객체 내부에 있는 빈 공간도 메워지게 된다.
위 그림은 이진 영상에서 팽창 연산을 수행하는 과정을 나타낸 것이다.
마스크 범위의 입력화소와 팽창 마스크의 원소 간(element-wise)에 일치하는 지를 비교한다. 팽창 마스크가 1인 원소와 해당 입력화소가 모두 불일치하면 출력화소로 0을 지정한다. 그리고 1개 화소라도 일치하게 되면 1이 출력화소로 결정된다.
아래 그림은 팽창 연산의 결과를 예시한 것이다.
팽창 연산 수행 결과로 객체의 외각이 확장되며 객체 내부의 빈 공간이 경계부분의 확장으로 인해 메워진다.
반면에 잡음으로 예상되는 작은 크기의 객체도 확장되는 것을 볼 수 있다.

열림 연산과 닫힘 연산

열림 연산과 닫힘 연산은 모폴로지의 기본 연산인 침식 연산과 팽창 연산의 순서를 조합하여 수행한다.
열림 연산(opening operator)은 침식 연산을 먼저 수행하고, 바로 팽창 연산을 수행한다.
침식 연산으로 인해 객체는 축소되고, 배경 부분의 미세한 잡음들은 제거된다.
다음으로 축소되었던 객체들이 팽창 연산으로 인해 다시 원래 크기로 돌아간다.
아래 그림은 열림 연산의 과정을 예시한 것이다. 배경 부분의 잡음을 제거하면서 침식 연산으로 인한 객체 크기의 축소를 방지할 수 있다.
다만 돌출된 부분은 제거된 후 다시 원래 크기로 돌아가지 않는다.
닫힘 연산(closing operator)은 팽창 연산을 먼저 수행하고, 다음으로 침식 연산을 수행한다.
팽창 연산으로 객체가 확장되어서 객체 내부의 빈 공간이 메워진다.
다음으로 침식 연산으로 확장되었던 객체의 크기가 원래대로 축소된다.
최종 결과 영상을 보면 객체 내부의 비어있던 공간이 채워지며, 인접한 객체를 이어지게 하는 효과도 있다.
모폴로지 연산은 한 번의 수행으로 결과 영상이 미흡할 경우에는 여러 번 반복적으로 수행할 수 있다.