10 분 소요

영역 기반 처리픽셀 기반 처리와 달리, 인근 화소들 간의 관계를 고려하여 영상을 처리합니다.
회선 기법은 영역 기반 처리의 한 종류입니다.

영역 기반 처리 예시로는

  • 흐리게 하기
  • 선명하게 하기
  • 경계선(Edge) 검출
  • 잡음 제거

등이 있습니다.

회선(Convolution) 기법

회선 기법은 각 화소에 대해 주변 화소들의 값을 조합하여 새로운 화소 값을 생성하는 방법입니다. 회선 기법은 영역 기반 처리의 한 종류로, 인근 화소들 간의 관계를 고려하여 영상을 처리합니다.

  • 입력 화소와 그 주위 화소를 이용하여 출력 화소값을 결정
  • 주로 마스크(mask) 또는 커널(kernel) 이라는 작은 행렬을 사용하여 연산을 수행

출력 픽셀 값 계산

  • 입력 픽셀과 그 주위 픽셀 값에 회선 마스크의 값을 곱하여 합한 값
  • 3x3 입력 픽셀 \(\begin{bmatrix} I_{1} & I_{2} & I_{3} \\ I_{4} & I_{5} & I_{6} \\ I_{7} & I_{8} & I_{9} \end{bmatrix}\)
  • 3x3 마스크 \(\begin{bmatrix} M_{1} & M_{2} & M_{3} \\ M_{4} & M_{5} & M_{6} \\ M_{7} & M_{8} & M_{9} \end{bmatrix}\)
  • 출력 픽셀 값 \(O \\= I_{1} \times M_{1} + I_{2} \times M_{2} + I_{3} \times M_{3}\\ + I_{4} \times M_{4} + I_{5} \times M_{5} + I_{6} \times M_{6}\\ + I_{7} \times M_{7} + I_{8} \times M_{8} + I_{9} \times M_{9}\)

Convolution in Continuous Domain

  • 입력 함수 $f(x, y)$와 마스크 함수 $h(x, y)$
  • 출력 함수 $g(x, y)$ \(g(x, y) = \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} f(x', y') \cdot h(x - x', y - y') \, dx' \, dy'\)

Convolution in Discrete Domain

  • 입력 함수 $f(x, y)$와 마스크 함수 $h(x, y)$
  • 출력 함수 $g(x, y)$ \(g(x, y) = \sum_{s = -\infty}^{\infty} \sum_{t = -\infty}^{\infty} f(s, t) \cdot h(x - s, y - t)\)

회선 마스크

회선 마스크는 입력 화소와 주변 화소들의 가중치를 결정하는 역할을 합니다.

회선 수행 방법

  • 먼저 우측 상단의 화소부터 시작
  • 한 줄이 끝나면 다음 줄로 이동

회선 마스크의 특성

회선 마스크가 홀수 크기의 행렬로 구성되는 이유는 다음과 같습니다.

  • 중심 화소
    • 회선 마스크의 중심에 위치한 화소
    • 입력 화소와 주변 화소들의 가중치를 결정하는 역할
      (모든 계수들의 합이 1 이 되도록 구성)
  • 주변 픽셀 대칭
    • 주위 픽셀 값을 각 방향에 대칭적으로 고려해야 함

중심 화소가 있고 주변 픽셀 값이 대칭적으로 고려되어야 하기 때문에, 회선 마스크의 크기는 보통 3x3, 5x5, 7x7, … 크기로 구성됩니다.

대부분의 회선 마스크는 모든 계수들의 합이 1 이 되도록 구성됩니다. 이는 회선된 영상의 밝기가 입력 영상과 동일하게 유지되도록 하기 위한 것입니다.

마치 물감을 섞을 때, 모든 색깔의 비율을 동일하게 유지하면 원래 색상이 변하지 않는 것과 같습니다.

일부 회선 마스크는 계수의 합이 0이 되도록 구성됩니다.

계수의 합이 0이 되는 마스크는 양수와 음수 계수를 동시에 포함합니다.
양수 계수는 현재 화소와 주변 일부 화소들의 밝기를 증가시키고, 음수 계수는 다른 주변 화소들의 밝기를 감소시킵니다.

계수의 합이 0인 마스크는 주변 화소들과의 차이를 강조하여 이미지의 가장자리를 선명하게 드러냅니다. 마치 그림자를 강조하듯, 주변 화소들과의 밝기 차이를 더욱 크게 만들어 가장자리가 눈에 띄도록 합니다.

이는 주변 화소들과의 차이를 강조하여 가장자리를 선명하게 드러내는 데 효과적이지만, 음수 화소값이 생성될 수 있다는 단점이 있습니다. 따라서 일반적으로 음수 화소값을 없애고 이미지의 밝기를 유지하기 위해 상수를 더해줍니다.

대표적으로 최대 밝기의 절반을 상수로 사용하는데, 이는 음수 화소값을 모두 양수 화소값으로 변환하면서도, 평균 밝기는 원래 이미지와 동일하게 유지하기 때문입니다.

회선 마스크의 특성을 정리하면 다음과 같습니다.

  • 회선 마스크의 크기는 홀수를 사용
  • 많은 회선 마스크들은 계수들의 합이 1 이됨
  • 경계선 검출등 일부 회선 마스크에서는 (음수의 계수를 포함하여) 계수 합이 0 이됨

영상의 경계 처리

회선 마스크를 이미지 처리에 적용할 때 가장 중요한 고민 중 하나는 바로 영상 경계 처리입니다.
윈도우는 우측 상단의 화소부터 시작하게 되는데, 우측 상단(0,0)을 윈도우의 중앙에 위치시키면 윈도우의 왼쪽 상단에는 영상을 벗어난 화소들이 위치하게 됩니다.
이러한 영상 경계 처리 문제를 해결하기 위한 다양한 방법이 존재합니다.

윈도우는 회선 마스크를 나타내는 행렬을 의미합니다.

가장 간단한 방법은 윈도우의 위치를 조정하는 것입니다. 윈도우가 영상과 완전히 중첩되는 위치부터 시작하면, 문제 없이 회선을 수행할 수 있습니다. 하지만 영상의 가장자리 화소들은 회선 마스크를 아예 적용하지 못하게 되고, 이는 결국 영상의 가장자리 정보가 손실되는 문제가 발생합니다.

또 다른 경계 처리 방법으로 0 삽입 방식이 있습니다. 우측 상단(0,0)에서부터 시작하되, 윈도우에서 빈 셀들의 계수를 0으로 가정하는 것입니다. 빈 셀은 영상을 벗어난 화소를 의미합니다.
0 삽입 방식을 사용하면 화소값이 0이 되므로, 사실상 무시되는 것과 같습니다.
앞서 설명한 윈도우의 위치를 조정하는 방법과 마찬가지로, 영상의 가장자리 정보가 손실되는 문제가 발생합니다.

가장자리 정보를 손실하지 않으면서도 영상 경계 처리 문제를 해결하기 위한 방법으로 원 영상의 크기를 조정하는 방법이 있습니다. 영상의 경계 부분 화소들을 복사하여 영상을 둘러싸는 방식으로 처리합니다. 채우는 방법에는 여러 가지가 있지만, 원 영상의 경계 화소를 복사하는 방법이 가장 간단합니다.

회선 기법의 응용

흐리게 하기

입력 픽셀 값을 주변 픽셀 값들의 평균으로 대체하여 흐리게 만드는 방법입니다.
평균 마스크를 사용하여 수행됩니다. 평균 마스크는 모든 픽셀에 동일한 가중치를 부여하는 마스크입니다.

\(\begin{bmatrix} \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \end{bmatrix}\) \(\begin{bmatrix} \frac{1}{16} & \frac{1}{16} & \frac{1}{16} \\ \frac{1}{16} & \frac{1}{16} & \frac{1}{16} \\ \frac{1}{16} & \frac{1}{16} & \frac{1}{16} \end{bmatrix}\)

Gaussian Smoothing가우시안 마스크를 사용하여 이미지를 흐리게 만드는 방법입니다. 가우시안 마스크는 중심 픽셀에 가장 높은 가중치를 부여하고 주변 픽셀로 갈수록 가중치가 점차 감소하는 마스크입니다.

  • Gaussian filter kernel \(\begin{bmatrix} 0.00000067 & 0.00002292 & 0.00019117 & 0.00038771 & 0.00019117 & 0.00002292 & 0.00000067 \\ 0.00002292 & 0.00078634 & 0.00655965 & 0.01330373 & 0.00655965 & 0.00078634 & 0.00002292 \\ 0.00019117 & 0.00655965 & 0.05472157 & 0.11098164 & 0.05472157 & 0.00655965 & 0.00019117 \\ 0.00038771 & 0.01330373 & 0.11098164 & 0.22508352 & 0.11098164 & 0.01330373 & 0.00038771 \\ 0.00019117 & 0.00655965 & 0.05472157 & 0.11098164 & 0.05472157 & 0.00655965 & 0.00019117 \\ 0.00002292 & 0.00078634 & 0.00655965 & 0.01330373 & 0.00655965 & 0.00078634 & 0.00002292 \\ 0.00000067 & 0.00002292 & 0.00019117 & 0.00038771 & 0.00019117 & 0.00002292 & 0.00000067 \end{bmatrix}\)
  • 가우시안 마스크의 값이 큰 부분은 입력 화소와 주변 화소들의 영향이 큼 (0.22508352)
  • 가우시안 마스크의 값이 작은 부분은 입력 화소와 주변 화소들의 영향이 작음 (0.00000067)

경계선(Edge) 검출

기본적인 edge 검출 방법은 영상을 (x, y) 변수의 함수로 간주하였을 때, 함수의 1차 미분 값이 크게 나타나는 부분을 검출합니다. 미분을 이용하면 앞의 그래프의 예시와 같이 값이 급격하게 바뀌는 부분 즉, 변화율을 찾을 수 있기 때문입니다.

1차 미분을 하는 방법은 흔히 알려져 있는 방식을 사용합니다. 아래는 1차 미분을 근사화 하는 방법이며 기본적으로 3가지 방식이 알려져 있습니다.

  • 1차 미분의 근사화
    • 순방향 차이(Forward Difference) : $f’(x) \approx \frac{f(x+h) - f(x)}{h}$
    • 후방향 차이(Backward Difference) : $f’(x) \approx \frac{f(x) - f(x-h)}{h}$
    • 중앙 차이(Central Difference) : $f’(x) \approx \frac{f(x+h) - f(x-h)}{2h}$

위 3가지 방식 중 마지막의 중앙 차분이 가장 근사화 오류가 작기 때문에 가장 많이 사용됩니다. \(\begin{bmatrix} -1 & 0 & 1 \end{bmatrix} \quad \begin{bmatrix} -1 \\ 0 \\ 1 \end{bmatrix}\) 따라서 edge detection을 위하여 위 그림과 같은 미분 마스크를 사용하게 됩니다. 이러한 미분 마스크는 Sobel, Prewitt, Roberts 등이 있습니다.

중앙 차분의 분모 부분인 $2h$ 모든 픽셀에 대해 동일하게 적용되기 때문에, 이후 그래디언트 계산 시 상쇄됩니다. 따라서 생략하여도 무방합니다.

  • 대표적인 미분 마스크
    • Sobel 마스크 \(\begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} \quad \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix}\)
    • Prewitt 마스크 \(\begin{bmatrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{bmatrix} \quad \begin{bmatrix} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{bmatrix}\)
    • Roberts 마스크 \(\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} \quad \begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix}\)

PrewittSobel 마스크의 차이는 가중치입니다.
Sobel 마스크는 중심 픽셀에 높은 가중치를 부여하고, 주변 픽셀로 갈수록 가중치가 감소합니다.
반면 Prewitt 마스크는 모든 픽셀에 동일한 가중치를 부여합니다.

그레디언트(Gradient)

영상은 2차원 공간에서 정의된 함수이기 때문에, 영상에서 미분 값을 이용하여 엣지를 찾기 위해서는 가로 방향과 세로 방향의 미분 값을 함께 사용해야 합니다. 2차원 공간상에서의 함수 f(x, y)가 있을 때, 이 함수의 그래디언트는 다음과 같이 벡터 형태로 정의됩니다.

\[\nabla f = \begin{bmatrix} \frac{\partial f}{\partial x} , \frac{\partial f}{\partial y} \end{bmatrix}\]

2차원 함수의 그래디언트는 위 수식과 같이 함수 f(x, y)를 x축과 y축으로 각각 편미분 한 값으로 구성됩니다. 그래디언트가 벡터이기 때문에 그래디언트는 크기와 방향 성분으로 표현할 수 있습니다.

그래디언트의 크기는 다음과 같이 정의됩니다. \(\left\| \nabla f \right\| = \sqrt{\left( \frac{\partial f}{\partial x} \right)^2 + \left( \frac{\partial f}{\partial y} \right)^2}\)

영상에서 엣지 위치를 찾기 위해서는 위와 같은 그래디언트의 절댓값을 계산하고, 이 값이 특정 값(임계값)보다 큰 경우 엣지로 판단합니다. 절댓값을 계산하는 방법은 다음과 같습니다. 픽셀 I(x,y)가 경계선일 가능성의 크기는 다음과 같이 정의됩니다.

  • $I_{r}(x,y)$ : 수평 경계선 검출용 회선 마스크 적용 결과 값
  • $I_{c}(x,y)$ : 수직 경계선 검출용 회선 마스크 적용 결과 값 \(\sqrt{I_{r}^2(x,y) + I_{c}^2(x,y)} > T\)

또한 그래디언트 벡터가 가리키는 방향, 즉 가장 경사가 심한 방향은 다음과 같이 삼각 함수를 사용하여 구할 수 있습니다. \(\theta = \arctan \left( \frac{\partial f}{\partial y} , \frac{\partial f}{\partial x} \right)\)

그래디언트의 방향은 언제 사용되는가?

  • Canny Edge Detection : 엣지의 방향을 고려하여 엣지를 검출하는 방법
  • Hough Transform : 직선이나 원 같은 도형을 검출하는 방법

선명하게 하기

영상 선명화는 흐릿한 영상의 디테일을 복원하거나 강조하여 더욱 선명하고 명확하게 보이도록 만드는 처리 과정입니다. 회선 마스크를 사용하여 선명화를 수행할 수 있습니다.

영상 선명화에는 다음과 같은 두 가지 대표적인 회선 마스크가 사용됩니다.

  • 마스크 1 \(\begin{bmatrix} 0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0 \end{bmatrix}\)

이 마스크는 중앙 픽셀을 제외한 주변 픽셀 값을 모두 -1씩 감소시킨 후, 중앙 픽셀 값을 5배하여 반영합니다.
이는 밝은 픽셀과 어두운 픽셀의 차이를 강조하여 엣지가 더욱 명확하게 보이도록 만드는 효과를 줍니다.

  • 마스크 2 \(\begin{bmatrix} -1 & -1 & -1 \\ -1 & 9 & -1 \\ -1 & -1 & -1 \end{bmatrix}\)

이 마스크는 모든 픽셀 값을 -1씩 감소시킨 후, 중앙 픽셀 값을 9배하여 반영합니다.
마스크 1과 마찬가지로 밝고 어두운 픽셀의 차이를 강조하여 선명화 효과를 제공합니다.

  • 회선 마스크 적용 방법 회선 마스크를 영상에 적용하는 방법은 다음과 같습니다.
    1. 마스크를 영상의 각 픽셀에 차례대로 겹쳐놓습니다.
    2. 마스크 내의 값과 겹쳐지는 픽셀 값들을 곱하여 값들의 합을 계산합니다.
    3. 계산된 합을 마스크 중앙 픽셀의 새로운 값으로 설정합니다.
    4. 위 과정을 영상의 모든 픽셀에 대해 반복합니다.

실제로 마스크 1이 적용되는 방식은 다음과 같습니다.

  • 마스크 1 == 아래의 마스크들의 합 \(\begin{bmatrix} 0 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix} \quad \begin{bmatrix} 0 & 0 & 0 \\ -1 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix} \quad \begin{bmatrix} 0 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & -1 & 0 \end{bmatrix} \quad \begin{bmatrix} 0 & 0 & 0 \\ 0 & 1 & -1 \\ 0 & 0 & 0 \end{bmatrix} \quad \begin{bmatrix} 0 & -1 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix}\)

‘나’ 와 각각의 경계를 더해주기 때문에 마스크 1을 적용하면 영상이 선명해지는 효과를 얻을 수 있습니다.
마스크 2는 대각선 방향까지 고려하였기 때문에 마스크 1보다 더욱 선명한 효과를 제공합니다.

잡음 제거

영상에는 다양한 종류의 잡음이 포함되어 있습니다. 잡음은 영상의 품질을 저하시키는 요인 중 하나이며, 영상 처리 과정에서 잡음을 제거하는 것은 매우 중요합니다. 잡음 제거는 영상의 품질을 향상시키는 데 도움이 되며, 영상 처리의 성능을 향상시킬 수 있습니다.
잡음의 종류에는 다음과 같은 것들이 있습니다.

  • Salt-and-Pepper Noise : 무작위로 흰색 또는 검은색 픽셀이 추가되는 잡음
    • 영상의 픽셀 값과는 뚜렷하게 다른 픽셀 값에 의한 잡음
  • Gaussian Noise : 가우시안 분포를 따르는 잡음(정규 분포를 따르는 잡음)
    • 영상의 픽셀 값으로부터 불규칙적으로 벗어나지만 뚜렷하게 벗어나지 않는 잡음

각 잡음의 특성에 따라 다양한 방법으로 잡음을 제거할 수 있습니다. 대표적인 잡음 제거 방법으로는 평균 필터, 미디언 필터 등이 있습니다.

평균 마스크 는 가우시안 잡음을 제거하는 데 효과적인 방법 중 하나입니다. #평균 마스크를 사용하면 영상의 대비를 약화시키기 때문에(흐리게 하기 참고), 잡음을 제거할 수 있습니다.

미디언 필터 는 Salt-and-Pepper 잡음을 제거하는 데 효과적인 방법 중 하나입니다. 미디언 필터는 주변 픽셀 값들 중 중간값을 선택하여 중앙 픽셀의 값을 대체하는 방법입니다. 해당 필터는 회선 기법을 사용하지 않는다는 점이 특징입니다.

필터 종류

  • 최대값 필터 : 주변 픽셀 값 중 가장 큰 값을 중앙 픽셀 값으로 설정
    • 팽창 연산(Dilation) : 이미지의 픽셀 값을 확장시키는 연산
  • 최소값 필터 : 주변 픽셀 값 중 가장 작은 값을 중앙 픽셀 값으로 설정
    • 침식 연산(Erosion) : 이미지의 픽셀 값을 축소시키는 연산
  • 중간값 필터 : 주변 픽셀 값들을 정렬한 후 중간값을 중앙 픽셀 값으로 설정
  • 평균값 필터 : 주변 픽셀 값들의 평균을 중앙 픽셀 값으로 설정
  • 가우시안 필터 : 가우시안 분포를 따르는 마스크를 사용하여 주변 픽셀 값들의 가중 평균을 중앙 픽셀 값으로 설정
  • 소벨 필터 : 영상의 경계를 검출하는 필터
  • 프리윗 필터 : 영상의 경계를 검출하는 필터
  • 로버츠 필터 : 영상의 경계를 검출하는 필터

추가적으로 최대값 필터최소값 필터팽창 연산침식 연산이라고도 불립니다. 이들은 모폴로지 연산의 일종으로, 이미지의 형태를 변형시키는 데 사용됩니다.
열림 연산과 닫힘 연산은 팽창 연산침식 연산을 조합한 것으로, 이미지의 노이즈를 제거하거나 이미지의 구멍을 메우는 데 사용됩니다.