Category Archives: 배우기

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

회선 (Convolution)

공간 영역의 개념과 회선

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

블러링(Blurring)

  • 블러링은 영상에서 화소값이 급격하게 변하는 부분들을 감소시켜 점진적으로 변하게 함으로써 영상이 전체적으로 부드러운 느낌이 나게 하는 기술이다.
    • 경우에 따라 스무딩(smoothing)이라고 하는 경우도 있다.
  • 화소값이 급격하게 변하는 것을 점진적으로 하는 방법은 회선을 이용한 필터링을 이용하는 것이다.
    • 마스크를 아래 그림과 같이 모든 원소의 값을 같게 구성하여 회선을 수행하면 블러링이 적용된다.
    • 이때 마스크의 전체 원소의 합은 1이 되어야 입력 영상의 밝기가 유지된다.
  • 아래 그림은 회선을 통한 블러링을 설명하기 위한 내용이다.
    • 아래 그림에서 O22와 O23의 계산에서 입력 영상 중 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)] = \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]

G_{x} = {f(x + dx, y) - f(x, y) \over dx} \fallingdotseq f(x+1, y) - f(x, y), (dx = 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)] \fallingdotseq \sqrt{G_{x}^{2} + G_{y}^{2}} \approx |G_{x}| + |G_{y}|

\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 방향 미분인 Gy와 같은 결과가 된다.
    • 또한 (b)와 같이 f(x, y), f(x+1, y) 위치에 -1과 1을 구성하여 회선을 수행하면, 회선 수식이 f(x+1, y) – f(x, y)이 되어서 x 방향 미분인 Gx가 적용된다.
    • 이렇게 회선의 수식을 이용해서 차분을 계산할 수 있도록 마스크의 원소를 구성하면 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에 대한 그래디언트의 발산으로 정의되며 수식으로 표현하면 다음과 같다.

\Delta f = \nabla^{2} f = \nabla \nabla f

  • 영상은 2차원 좌표계이기 때문에 2차원 직교좌표계에서 라플라시안의 수식은 다음과 같다.

\nabla^{2} f = {\partial^{2} f \over \partial x^{2}} + {\partial^{2} f \over \partial y^{2}}

  • 각 항을 디지털 영상의 화소로 근사하여 1차 미분한 결과에 한 번 더 미분을 수행하면 다음과 같이 정리할 수 있다.

{\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(x-1, y)]

= f(x+1, y) - 2 \cdot f(x, y) - f(x-1, 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, y-1)]

= f(x, y+1) - 2 \cdot f(x, y) - f(x, y-1)

  • 두 항을 더하면 라플라시안 마스크의 공식이 완성된다.

\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σ는 가우시안 스무딩 마스크이며, *는 회선을 의미한다.

\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 \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) = ({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)를 이용해서 화소 기울기의 크기(magnitude)와 방향(direction)을 계산한다. 그리고 기울기의 방향은 4개 방향 (0, 45, 90, 135)로 근사하여 단순화 한다.
    • 여기서 아래 그림과 같이 기울기의 방향과 에지의 방향은 수직을 이루는 것에 유의하자.
  • 비최대치 억제(non-maximum suppression)라는 것은 현재 화소가 이웃하는 화소들보다 크면 에지로 보존하고 그렇지 않으면 에지가 아닌 것으로 간주해서 제거하는 것이다.
    • 먼저 에지의 방향에 있는 이웃 화소는 비교할 필요가 없기 때문에 아래 그림과 같이 기울기의 방향에 있는 두 개의 화소를 비교 대상으로 선택한다.
    • 그리고 현재 화소와 선택된 두 화소의 에지 강도를 비교하여 최대치가 아니면 억제되고, 최대치인 것만 에지로 결정한다.
  • 비최대치를 억제하여도 에지가 아닌 것이 에지로 결정된 경우가 많이 존재한다. 잘못된 에지를 제거하는 쉬운 방법 중 하나가 임계값을 설정하고, 에지의 강도가 이 임계값보다 작으면 에지에서 제외하는 것이다.
    • 그러나 이 방법은 임계값이 높으면 실제 에지도 제거될 수 있으며, 임계값이 낮으면 잘못된 에지를 제거하지 못하는 문제가 생길 수 있다.
  • 캐니 알고리즘은 잘못된 에지를 제거하고 정확한 에지만을 검출하여 에지가 끊어지는 것을 방지하는 방법으로 이력 임계값 방법(hysteresis thresholding)을 사용한다.
    • 이것은 두 개의 임계값 (Thigh, Tlow)을 사용해서 에지의 이력을 추적하여 에지를 결정하는 방법이다.
    • 이 방법은 각 화소에서 높은 임계값 (Thigh) 보다 크면 에지 추적을 시작한다.
    • 그리고 추적을 싲가하면 추적하지 않은 이웃 화소들을 대상으로 낮은 임계값 (Tlow) 보다 큰 화소를 에지로 결정하는 방식이다.
  • 아래 그림의 예시를 보면 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(\mu, \sigma)(x) = {1 \over \sigma \sqrt{2\pi}} exp(- {(x - \mu)^{2} \over 2 \sigma^{2}})

 

  • 가우시안 분포를 회선 마스크로 적용하려면 2차원으로 구성해야 한다. x, y 좌표를 축으로 2차원 가우시안 분포 함수를 구성하면 다음의 수식과 같고 이것을 그래프로 표현하면 아래 그림과 같다.

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)은 팽창 연산을 먼저 수행하고, 다음으로 침식 연산을 수행한다.
    • 팽창 연산으로 객체가 확장되어서 객체 내부의 빈 공간이 메워진다.
    • 다음으로 침식 연산으로 확장되었던 객체의 크기가 원래대로 축소된다.
    • 최종 결과 영상을 보면 객체 내부의 비어있던 공간이 채워지며, 인접한 객체를 이어지게 하는 효과도 있다.
    • 모폴로지 연산은 한 번의 수행으로 결과 영상이 미흡할 경우에는 여러 번 반복적으로 수행할 수 있다.

데코수학/ 연립 1차 방정식 푸는법

개념

  • 연립 1차 방정식
    • 다음과 같은 방정식에 대하여
    • a_{11} x_{1} + a_{12} x_{2} + ... +  a_{1n} x_{n} = b_{1} \\ a_{21} x_{1} + a_{22} x_{2} + ... +  a_{2n} x_{n} = b_{2} \\ ... \\ a_{m1} x_{1} + a_{m2} x_{2} + ... +  a_{mn} x_{n} = b_{m}
    • X = \left( \begin{array}{rrrr} x_{1} \\ x_{2} \\ ... \\ x_{n}  \end{array} \right), B = \left( \begin{array}{rrrr} b_{1} \\ b_{2} \\ ... \\ b_{m}  \end{array} \right) 이라 두면
    • 방정식을 다음과 같은 형태로 쓸 수 있다.
    • \left( \begin{array}{rrrr} a_{11} & a_{12} & ... & a_{1n} \\ a_{21} & a_{22} & ... & a_{2n} \\ ... \\ a_{m1} & a_{m2} & ... & a_{mn} \end{array} \right) \left( \begin{array}{rrrr} x_{1} \\ x_{2} \\ ... \\ x_{n}  \end{array} \right) = \left( \begin{array}{rrrr} b_{1} \\ b_{2} \\ ... \\ b_{m}  \end{array} \right)
    • 즉, 방정식을 AX = B 형태로 쓸 수 있다.
    • 이때 B = 0 이면 homogeneous라 하고, B \neq 0 이면 non-homogeneous라 한다.
  • 연립 방정식과 행렬
    • 연립 방정식에 다음 행위를 유한번 해도 해는 바뀌지 않는다.
      1. 두 식의 순서 바꾸기
      2. i번째 식에 0이 아닌 스칼라 곱하기
      3. i번째 식에 j번째 식 더하기
    • 위 과정으로 방정식을 간단한 형태로 바꾸면 된다.
    • 위 방법을 AX = B 에 대한 행렬의 언어로 쓰면 다음과 같다.
    • 행렬 (A|B) 에 다음 행위를 유한번 해도 X 는 바뀌지 않는다.
      1. 두 행의 순서 바꾸기
      2. i번째 행에 0이 아닌 스칼라 곱하기
      3. i번째 행에 j번째 행 더하기
    • 위 과정으로 (A|B) 를 ‘간단한 형태’로 만들면 된다.
    • (A|B) A B 를 이어붙여 만든 행렬을 말한다. (argumented matrix)
    • 위 1, 2, 3의 과정을 기본행 연산이라 부르고, A가 기본행연산으로 B가 된다면 A \sim_{R}B 라 쓰고 행동치라 부른다.
    • ‘간단한 형태’란 RRE form을 말한다.
  • A : Row Echelon form
    1. 모든 성분이 0인 행은 아래에 위치한다.
    2. 0이 아닌 성분이 있는 행에 대하여 가장 앞에 있는 것을 pivot 이라 부를 때, pivot이 더 앞에 있는 행일 수록 더 위에 위치한다.
  • A : Reduced Row Echelon form
    1. A: Row Echelon form
    2. pivot 들이 전부 1이고, pivot이 있는 열은 piovt 외엔 전부 0이다.
  • 모든 행렬은 유한번의 기본행연산으로 RRE form으로 만들 수 있고 유일하다.
    • 그렇게 변환시킨 RRE form으로 연립방정식을 쉽게 풀 수 있다.
  • 연립일차방정식 AX = 0 의 해 X_{1}, X_{2} 에 대하여 cX, X_{1} + X_{2} 도 해가 될 수 있다.
    • 이를 선형성이라 한다.
  • 연립일차방정식 AX = 0 에서 A m \times n (n > m) 행렬이면, 자명하지 않은 해를 가진다.
  • 기본행연산을 행렬곱으로 정의
    • A의 i번째 행과 j번째 행을 바꾸기
      • \Leftrightarrow I_{[i] \leftrightarrow [j]} \cdot A
    • A의 i번째 행에 0이 아닌 스칼라 C 곱하기
      • \Leftrightarrow I_{c [i]} \cdot A
    • A의 i번째 행에 j번째 행 더하기
      • \Leftrightarrow I_{[i] \leftarrow + [j]} \cdot A
    • 단위행렬에 적절한 변환을 준 후 행렬에 곱하면 기본행 연산이 된다. 위와 같이 변환된 단위행렬을 기본행렬이라 한다.
  • 기본행렬은 가역이고, 역행렬들도 기본행렬이다.
  • 가역인 RRE from은 I 뿐이다.
  • A : 가역
    • \Leftrightarrow A \sim_{R} I
    • \Leftrightarrow A = E_{1} E_{2} ... E_{k} (\exists E_{i} : 기본행렬)
    • \Leftrightarrow AX = 0 의 자명해는 X = 0 뿐이다.
    • \Leftrightarrow AX = B 는 유일해를 가진다.

데코수학/ 행렬 – 2

 

개념

  • 전치행렬
    • A = (a_{ij}) 일 때,
      • A^{T} = (a_{ji})
  • 대각합
    • A = (a_{ij}) \in m_{n, n} 일 때,
      • tr(A) = \sum_{x=1}^{n} a_{xx}
  • 가역행렬
    • 가역행렬이란 역행렬을 가지는 행렬
    • A : 가역 
      • \Leftrightarrow \exists B, BA = AB = I
      • 이때 B를 A의 역행렬이라 부른다.
  • 역행렬
    • A 의 역행렬은 A^{-1} 로 표기
    • A 의 역행렬은 유일하다.
    • A = \left( \begin{array}{rr} a & b \\ c & d  \end{array} \right) 일 때,
      • A^{-1} = {1 \over ad - bc} \left( \begin{array}{rr} d & -b \\ -c & a  \end{array} \right)
  • 가역행렬과 역행렬은 정사각행렬에서만 정의 가능.
  • AB = 0 이어도 BA = 0 이 안 될 수 있다.
    • A = \left( \begin{array}{rr} 1 & 0 \\ 0 & 0  \end{array} \right), B = \left( \begin{array}{rr} 0 & 0 \\ 1 & 0  \end{array} \right) 일 때 성립 안 함.
  • O(n) = \{ A \in M_{n, n}(\mathbb{R}) | A^{-1} = A^{T} \} 일 때, (역행렬과 전치행렬이 같은 행렬들의 집합. 직교행렬이라고도 한다)
    • I_{n} = O(n)
    • A, B \in O(n) \Rightarrow AB \in O(n)
    • A \in O(n) \Rightarrow A^{-1} \in O(n)
    • A \in O(n) \Rightarrow A^{T} \in O(n)

행렬식

  • (A^{T})^{T} = A
  • (A + B)^{T} = A^{T} + B^{T}
  • (cA)^{T} = cA^{T}
  • (AB)^{T} = B^{T}A^{T}
  • tr(A+B) = tr(A) + tr(B)
  • tr(cA) = c \cdot tr(A)
  • tr(A^{T}) = tr(A)
  • tr(AB) = tr(BA)
  • I^{-1} = I
  • (cA)^{-1} = {1 \over c} A^{-1}
  • (AB)^{-1} = B^{-1}A^{-1}
  • (A^{-1})^{-1} = A
  • (A^{T})^{-1} = (A^{-1})^{T}
  • (A^{-1})^{n} = (A^{n})^{-1}
  • (A^{n})^{T} = (A^{T})^{n}
    • 위 3가지 경우에 의해 n(거듭제곱), -1(역행렬), T(전치행렬)은 순서를 바꿔도 무방하다.

데코수학/ 행렬 – 1

개념

  • 행렬의 정의
    • 행렬이란 벡터공간 위에 있는 선형 함수
    • 행렬이란 숫자들의 2차원 배열
    • i = 1, 2, ... , m, j = 1, 2, ... , n, a_{ij} \in \mathbb{F} 일 때
      • A = \left( \begin{array}{rrrr} a_{11} & a_{12} & ... & a_{1n} \\ a_{21} & a_{22} & ... & a_{2n} \\ ... \\ a_{m1}  & a_{m2} & ... & a_{mn} \end{array} \right) \mathbb{F} 위의 m \times n 행렬이라 한다.
  • 행렬 표기법
    • A = a_{ij}
    • M_{m, n}(\mathbb{F}) : \mathbb{F} 위의 모든 m \times n 행렬의 집합
    • [A]_{i} : A의 i번째 행 (1 \times n 벡터)
    • [A]^{j} : A의 j번째 열 (m \times 1 벡터)
  • A = (a_{ij}), B = (b_{ij}) \in M_{m, n}(\mathbb{F}) 일 때
    • A = B \Leftrightarrow \forall_{i,j}, a_{ij} = b_{ij}
    • A + B := (a_{ij} + b_{ij})
    • c A := (c \cdot a_{ij})
  • A = (a_{ij}) \in M_{m, n}, B = (b_{ij}) \in M_{n, l} 일 때
    • AB := (\sum_{x=1}^{n} a_{ix} b_{xj}) \in M_{m, l}
      • ab_{ij} = [A]_{i} \cdot [B]^{j}
  • 0_{m, n} = (0)
  • I_{n} = (\delta_{ij})
    • \delta_{ij} \Rightarrow 1 (i = j), 0 (i \neq j) 
  • A = \left( \begin{array}{rr} a & b \\ c & d \end{array} \right)
    • \Rightarrow A^{2} - (a + d) A + (ad -bc) I = 0

행렬식

  • A, B 행렬, r, s \in \mathbb{F}
    • A + B = B + A
    • A + (B + C) = (A + B) + C
    • A + 0 = A
    • A + (-A) = 0
    • (r + s)A = rA + sA
    • r(A + B) = rA + rB
    • r(sA) = (rs)A
    • (AB)C = A(BC)
    • AI = IA = A
    • (A + B)C = AC + BC
    • r(A)B = r(AB) = A(rB)
    • A^{n} := A \cdot A^{n-1}
    • A^{0} = I

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

영상 화소의 접근

at

  • 행렬의 지정된 원소(화소)에 접근하는 템플릿 함수
반환형 이름 파라미터
_Tp& at int i,
_Tp& at int i, int j,
_Tp& at int i, int j, int k
_Tp& at Point pt
_Tp& at const int* idx
_Tp& at const vec<int, n>& idx

ptr

  • 행렬에서 지정된 행에 대한 포인터를 반환한다.

MatIterator/ MatConstIterator

  • Mat의 반복자 클래스
  • MatIterator는 읽기와 쓰기가 가능한 반복자를 반환
  • MatConstIterator는 읽기만 가능한 반복자를 반환
반환형 이름 파라미터
MatIterator_<_Tp> begin  
MatIterator_<_Tp> end  
MatConstIterator_<_Tp> begin  
MatConstIterator_<_Tp> end  

화소 밝기 변환

밝기 조절

  • Mat에 at을 각 원소별로 접근하고 그 값을 제어
  • Mat에 Rect를 이용해서 범위을 가져오고 그 값을 제어
  • Mat에 상수를 더해서 영상을 밝게 만들 수 있고, 상수를 빼서 영상을 어둡게 만들 수 있다.
  • 255에서 Mat을 빼면 영상을 반전시킬 수 있다.

영상 합성

  • 두 Mat을 더하면 영상 합성이 되고, 두 Mat을 빼면 차영상(difference image)가 된다.

명암 대비

  • 낮은 명암 대비 영상은 밝은 부분과 어두운 부분의 차이가 크지 않아 전체적으로 어둡거나 밝은 영상이고, 높은 명암 대비 영상은 밝은 부분과 어두운 부분의 차이가 큰 영상이다.
  • 영상 내에서 명암 대비를 제어하려면 어두운 부분은 더 어둡게, 밝은 부분은 더 밝게 만들어야 하는데, 이는 곱셈 연산을 통해 가능하다.
  • 명암 대비를 늘리기 위해서는 1.0 이상의 값을 곱하고, 명암 대비를 줄이려면 1.0 이하의 값을 곱해주면 된다.

히스토그램

  • 히스토그램이란 어떤 데이터가 얼마나 많은지를 나타내는 도수 분포표를 그래프로 나타낸 것.
    • 보통 히스토그램에서는 가로축이 계급, 세로축이 빈도수를 뜻한다.
    • 영상 처리에서 히스토그램은 화소의 분포를 나타내는 지표이기 때문에 이 분포를 이해하면 영상의 특성을 판단할 수 있는 유용한 도구가 될 수 있다.
반환형 이름 파라미터 내용
void calcHist const Mat* images,
int nimages,
const int* channels,
InputArray mask,
OutputArray hist,
int dims,
const int* histSize,
const float** ranges,
bool uniform = true,
bool accumulate = false
다차널의 행렬에서 다차원의 히스토그램을 그리는 함수

히스토그램 스트레칭(stretching)

  • 히스토그램 스트레칭이란 명암 분포가 좁은 히스토그램을 좌우로 잡아 당겨서 고른 명암 분포를 가진 히스토그램이 되게 하는 것. 이를 통해 영상의 화질이 변경되고 개선될 수 있다.
  • 히스토그램의 스트레칭 대상이 되는 두 곳이 빈도갑이 가장 낮은 화소값과 가장 높은 화소값이 된다.
    • 가장 낮은 화소값을 0으로 당기고, 가장 높은 화소값을 255로 당기면 그 중간의 화소값들은 각각의 비율에 따라 스트레칭 된다. (가장 낮은 화소값은 히스토그램 그래프 상 가장 왼쪽, 가장 높은 화소값은 가장 오른쪽이 된다)
  • 히스토그램 스트레칭 공식
    • 새 화소값 = (화소값 – low) x 255 / (high – low)
      • high는 최고 화소값, low는 최저 화소값

히스토그램 평활화(equalization)

  • 히스토그램 평활화 알고리즘은 ‘분포의 균등’이라는 방법을 이용해 명암 대비를 증가시킨다. 이를 통해 영상의 인지도를 높이며, 영상의 화질을 개선할 수 있다.
  • 히스토그램의 분포가 좁지는 않지만 특정 부분에서 한쪽으로 치우친 명암 분포를 가진 영상들은 명암 분포가 좁지 않기 때문에 히스토그램 스트레칭으로는 문제가 해결되지 않는다. 이런 영상에서는 히스토그램 평활화를 이용해야 한다.
  • 히스토그램 평활화 과정
    • 영상의 히스토그램을 계산한다.
    • 히스토그램 빈도값에서 누정 빈도수(누적합)를 계산한다.
    • 누적 빈도수를 정규화(정규화 누적합)한다.
    • 결과 화소값 = 정규화 누적합 * 최대 화소값
  • 평활화 화소값 계산식
    • 평활화 결과 화소값 = 입력 화소의 정규화 누적합 x 최대 화소값

평활화 예제

  • 아래와 같은 분포를 가진 이미지가 있다고 하자
0 2 2 1
1 2 3 2
1 2 3 2
1 3 1 7
  • 각 화소값에 대한 빈도수, 누적 빈도수, 정규화 누적합, 평활화 결과는 아래와 같다.
    • 평활화 결과는 반올림해서 사용한다.
화소값 0 1 2 3 4 5 6 7
빈도수 1 5 6 3 0 0 0 1
누적 빈도수 1 6 12 15 15 15 15 16
정규화 누적합 1/16 = 0.0625 6/16 = 0.375 12/16 = 0.75 15/16 = 0.9375 15/16=0.9375 15/16=0.9375 15/16=0.9375 16/16 = 1
평활화 결과 0.0625 x 7=0.4375 0.375 x 7=2.625 0.75 x 7 = 5.25 0.9375 x 7 = 6.5625 0.9375 x 7 = 6.5625 0.9375 x 7 = 6.5625 0.9375 x 7 = 6.5625 1 x 7 = 7

컬러 공간 변환

RGB 컬러 공간

  • 빛의 3원색을 이용해 만든 컬러 공간. 빨강(red), 파랑(blue), 초록(green)으로 이루어진다.
  • 원색의 조합은 섞을 수록 밝아지기 때문에 가산혼합이라 한다.

CMY(K) 컬러 공간

  • 색의 삼원색을 이용한 컬러 공간. 빛의 삼원색과 보색 관계에 있는 청록(cyan), 자홍(magenta), 노랑(yellow)로 이루어진다.
  • 색은 섞을수록 어두워지기 때문에 감산 혼합이라 한다.

HSI 컬러 공간

  • HSI는 색상(Hue), 채도(Saturation), 명도(Intensity Value)라는 3가지 변수로 구분된다.
    • 색상은 빛이 물체에서 반사되어 나온 색으로 파장을 시각적으로 표현한 값.
    • 채도는 색의 순수한 정도로 순색(pure color)에 흰색의 혼합 비율에 따라 0~100의 값을 갖는다.
    • 명도는 빛의 세기로 색의 밝고 어두운 정도를 나타낸다. 0~100의 값이며 0이면 검은색, 100이면 흰색이 된다.
  • RGB 컬러 공간에서 HIS 컬러 공간으로 변경하는 공식
    • H
      • If B ≤ G
        • H = cos^{-1} [ {((R - G) + (R + B)) \times 0.5 \over \sqrt{(R - G^{2}) + (R - B) \times (G - B)} } ]
      • Else
        • H = 360 - H
    • S
      • S = 1 - {3 \times min (R, G, B) \over (R + G + B)}
    • I
      • I = {(R + G + B) \over 3}
  • HSV 컬러 공간에 대한 변환 공식
    • H
      • If V = R
        • H = {(G - B) \times 60 \over S}
      • Else if V = G
        • H = {(G - B) \times 60 \over S} +120
      • Else if V = B
        • H = {(G - B) \times 60 \over S} + 240
    • S
      • If V = 0
        • S = 0
      • Else
        • S = {min (R, G, B) \over V}
    • V
      • V = max(R, G, B)

YCrCb 컬러 공간

  • YCrCb 컬러 공간은 영상 시스템에서 사용되는 색공간의 일종으로 영상 데이터를 압축하는 방식이다.
  • 인간의 시각은 밝기에 민감하지만 색상에는 덜 민감하다는 점을 이용해서 YCrCb 컬러 공간에서는 색차 신호인 Cr, Cb 성분을 Y 성분보다 상대적으로 낮은 해상도고 구성해서 인간의 시각에서 화질의 큰 저하 없이 영상 데이터의 용량을 감소 시킬 수 있다.
  • RGB와 YCbCr 변환 공식
    • Y = 0.299R + 0.857G + 0.114B
    • Cb = (R - Y) \times 0.564 + 128
    • Cr = (B - Y) \times 0.713 + 128
    • R = Y + 1.403 \times (Cr - 128)
    • G = Y - 0.714 \times (Cb - 128) - 0.344(Cb - 128)
    • B = Y + 1.773 \times (Cb - 128)
    • R = Y + 1.403 x (Cr – 128)
    • G = Y – 0.714 x (Cb – 128) – 0.344 x (Cb – 128)
    • B = Y + 1.773 x (Cb – 128)

YUV 컬러 공간

  • YUV 컬러 공간은 TV 방송 규격에서 사용하는 컬러 표현 방식이다. PAL 방식의 아날로그 비디오를 위해 개발되었지만 디지털 비디오에서도 유럽의 비디오 표준으로 사용하고 있다.
  • RGB와 YUV 변환 공식
    • Y = 0.2160R + 0.7142G + 0.0722B
    • U = -0.0999R - 0.3360G + 0.4360B
    • V = 0.6150R - 0.5586G - 0.05639B
    • R = Y + 1.28033V
    • G = Y - 0.21482U - 0.38059V
    • B = Y + 2.12798U

데코수학/ 헬름홀츠 분해정리

개념

  • \vec{F} : \mathbb{R}^{3} \to \mathbb{R}^{3} : 커얼로 써지는 벡터장
    • \Leftrightarrow \exists \vec{A} : \mathbb{R}^{3} \to \mathbb{R}^{3}, \vec{F} = \nabla \times \vec{A}
    • 이때 \vec{A} 를 벡터포텐셜이라 부른다.
  • \vec{F} : 커얼로 써지는 벡터장 \Rightarrow \vec{F} : 발산하지 않음
    • \vec{F} = \nabla \times \vec{A} \Rightarrow \nabla \cdot \vec{F} = \nabla \cdot (\nabla \times \vec{A}) = 0
  • 헬름홀츠 분해정리 (벡터미적분학의 기본 정리)
    • \vec{F} : \Omega (\subseteq \mathbb{R}^{3}, 유계 ) \to \mathbb{R}^{3} : C^{2} \Rightarrow \vec{F} = \vec{G} + \vec{H}
      • \vec{G} : 보존적 벡터장
      • \vec{H} : 커얼로 써지는 벡터장
  • 헬름홀츠 분해정리 (정의역이 \mathbb{R}^{3}, 전체인 버전)
    • \vec{F} : \mathbb{R}^{3} \to \mathbb{R}^{3} : C^{2}, \lim_{\|\vec{x}\| \to \infty} \||\vec{x}\|^{2} \|\vec{F}(\vec{x})\| = 0
      • \Rightarrow \vec{F} = \vec{G} + \vec{H}
  • 헬름홀츠 분해정리의 따름 정리
    • \vec{F} : \mathbb{R}^{3} \to \mathbb{R}^{3} : C^{2}, \lim_{\|\vec{x}\| \to \infty} \||\vec{x}\|^{2} \|\vec{F}(\vec{x})\| = 0 인 경우
      • \nabla \times \vec{F} = \vec{0} \Leftrightarrow \vec{F} = - \nabla \Phi
      • \nabla \cdot \vec{F} = 0 \Leftrightarrow \vec{F} = \nabla \times \vec{A}

데코수학/ 급수전개법

개념

  • f(x) : p에서 해석적 (Analytic, C^{\omega} )
    • \Leftrightarrow (x = p 근처에서) f(x) = \sum_{k=0}^{\infty} a_{k} (x-p){k}
  • f(x) : 해석적
    • \Leftrightarrow 정의역에 있는 임의의 x = p에 대하여, p에서 해석적이다.
  • 해석함수의 특징, 종류
    • f(x) : C^{\omega} \Rightarrow f(x) : C^{\infty}
    • sin x, cos x, e^{x}, 3x^{2} + 2x + 7 : C^{\omega}
    • 초등함수는 C^{\omega}
    • erf(x) = {2 \over \sqrt{\pi}} \int_{0}^{x} e^{-t^{2}} dt : C^{\omega}
  • e^{xi} = i sin x + cos x
    • 위 식의 x 자리에 \pi 를 넣으면 e^{\pi i} = i sin \pi + cos \pi = 0 - 1 = -1 이 된다. (오일러의 공식)
  • 급수전개법
    • 테일러 급수전개 – 무한차 다항식
    • 로랑 급수전개 – 해석적인 항 + 해석적이지 않은 항
    • 푸리에 급수전개 – 주기함수
    • 다중극전개 – 물리학에서 사용

데코수학/ 원통좌표계 , 구면좌표계

개념

  • 원통좌표계 (R, \theta, z )
    • R : xy 평면상에서 원점부터의 거리
    • \theta : x축에서 y축으로 돌아간 각도 (0 \leq \theta < 2 \pi )
    • z : 높이
  • 직교 좌표계의 단위 벡터 \hat{x}, \hat{y}, \hat{z} 를 원통좌표계의 단위벡터 \hat{R}, \hat{\theta}, \hat{z} 로 고치기
    • \hat{R} = \cos \theta \hat{x} + \sin \theta \hat{y}
    • \hat{\theta} = - \sin \theta \hat{x} + \cos \theta \hat{y}
    • \hat{z} = \hat{z}
    • \hat{x} = \cos \theta \hat{R} - \sin \theta \hat{\theta}
    • \hat{y} = \sin \theta \hat{R} + \cos \theta \hat{\theta}
    • \hat{z} = \hat{z}
  • 미소량 dx, dy, dz, dx \wedge dy, dy \wedge dz... 등을 dR, d\theta, dz 로 고치기
    • dx = \cos \theta dR - R \sin \theta d\theta
    • dy = \sin \theta dR + R \cos \theta d\theta
    • dz = dz
    • dx \wedge dy = R dR \wedge d\theta
    • dx \wedge dy \wedge dz = R dR \wedge d\theta \wedge dz
    • d \vec{l} = dR \hat{R} + R d\theta \hat{\theta} + dz \hat{z}
  • 직교좌표계의 편미분 {\partial f \over \partial x},  {\partial f \over \partial z} {\partial \over \partial R}, {\partial \over \partial \theta} 로 고치기
    • {\partial f \over \partial x} = \cos \theta {\partial f \over \partial R} - {\sin \theta \over R} {\partial f \over \partial \theta}
    • {\partial f \over \partial y} = \sin \theta {\partial f \over \partial R} + {\cos \theta \over R} {\partial f \over \partial \theta}
    • {\partial f \over \partial z} = {\partial f \over \partial z}
  • \nabla f, \nabla \cdot \vec{F}, \nabla \times \vec{F}, \nabla^{2} f 를 원통좌표계 표현법으로 고치기
    • \nabla f = {\partial f \over \partial R} \hat{R} + {1 \over R} {\partial f \over \partial \theta} \hat{\theta} + {\partial f \over \partial z} \hat{z}
    • \nabla \cdot \vec{F} = div(F_{R}\hat{R} + F_{\theta}\hat{\theta} + F_{z}\hat{z})
      • = {1 \over R} {\partial \over \partial R} (R F_{R}) + {1 \over R} {\partial F_{\theta} \over \partial \theta} + {\partial F_{z} \over \partial z}
    • \nabla \times \vec{F} = curl(F_{R}\hat{R} + F_{\theta}\hat{\theta} + F_{z}\hat{z})
      • = ({1 \over R} {\partial F_{z} \over \partial \theta} - {\partial F_{\theta} \over \partial z}) \hat{R} + ({\partial F_{R} \over \partial z} - {\partial F_{R} \over \partial R}) \hat{\theta} + {1 \over R} ({\partial \over \partial R} (R F_{\theta}) - {\partial F_{R} \over \partial \theta}) \hat{z}
    • \nabla^{2} f = div(\nabla f)
      • = {1 \over R} {\partial \over \partial R} (R {\partial f \over \partial R}) + {1 \over R^{2}} {\partial^{2} f \over \partial \theta^{2}} + {\partial^{2} f \over \partial z^{2}})
  • 구면좌표계 (r, \theta, \phi )
    • r : 원점부터의 거리
    • \theta : xy 평면상에서 x축에서 y축으로 돌아간 각도 (0 \leq \theta < 2 \pi )
    • \phi : z축과 r사이의 각도 (z축에서 xy평면으로 내려오는 각도 (0 \leq \phi < \pi )
  • 좌표 변환
    • x = r \sin \phi \cos \theta
    • y = r \sin \phi \sin \theta
    • z = r \cos \phi
    • r = \sqrt{x^{2} + y^{2} + z^{2}}
    • \theta = \arctan {y \over x}
    • \phi = \arctan {\sqrt{x^{2} + y^{2}} \over z}
  • 단위벡터 변환
    • \hat{r} = \sin \phi \cos \theta \hat{x} + \sin \phi \sin \theta \hat{y} + \cos \phi \hat{z}
    • \hat{\theta} = - \sin \theta \hat{x} + \cos \theta \hat{y}
    • \phi = \hat{\theta} \times \hat{r} = \cos \theta \cos \phi \hat{x} + \sin \theta \cos \phi \hat{y} + \sin \phi \hat{z}
    • \hat{x} = \cos \theta \sin \phi \hat{r} - \sin \theta \hat{\theta} + \cos \theta \cos \phi \hat{\phi}
    • \hat{y} =  \sin \theta \sin \phi \hat{r} + \cos \theta \hat{\theta} + \sin \theta \cos \phi \hat{\phi}
    • \hat{z} = \cos \phi \hat{r} - \sin \phi \hat{\phi}
  • 미소량 표현
    • dx, dy, dz \leftrightarrow dr, d\theta, d\phi
    • dx \wedge dy \wedge dz = r^{2} \sin \phi dr \wedge d\theta \wedge d\phi = dv
    • d\vec{l} = dr\hat{r} + r \sin \phi d\theta \hat{\theta} + r d\phi \hat{\phi}
    • {\partial f \over \partial x} = \cos \theta \sin \phi {\partial f \over \partial r} - {\sin \theta \over r \sin \phi} {\partial f \over \partial \theta} + {\cos \theta \cos \phi \over r} {\partial f \over \partial \phi}
    • {\partial f \over \partial y} = \sin \theta \sin \phi {\partial f \over \partial r} - {\cos \theta \over r \sin \phi} {\partial f \over \partial \theta} + {\sin \theta \cos \phi \over r} {\partial f \over \partial \phi}
    • {\partial f \over \partial z} = \cos \phi {\partial f \over \partial r} - {\sin \phi \over r} {\partial f \over \partial \phi}
  • \nabla f, \nabla \cdot \vec{F}, \nabla \times \vec{F}, \nabla^{2} f 를 구면좌표계 표현법으로 고치기
    • \nabla f = {\partial f \over \partial r} \hat{r} + {1 \over r \sin \phi} {\partial f \over \partial \theta} \hat{\theta} + {1 \over r} {\partial f \over \partial \phi} \hat{\phi}
    • \nabla \cdot \vec{F} = div(F_{r}\hat{r} + F_{\theta}\hat{\theta} + F_{\phi}\hat{\phi})
      • = {1 \over r^{2}} {\partial \over \partial r} (r^{2} F_{r}) + {1 \over r \sin \phi} {\partial F_{\theta} \over \partial \theta} + {1 \over r \sin \phi} {\partial \over \partial \phi} (\sin \phi F_{\phi})
    • \nabla \times \vec{F} = curl(F_{r}\hat{r} + F_{\theta}\hat{\theta} + F_{\phi}\hat{\phi})
      • = {1 \over r \sin \phi} ({\partial \over \partial \phi} (\sin \phi F_{\theta}) - {\partial F_{\theta} \over \partial \theta}) \hat{r} + {1 \over r} ({\partial \over \partial r} (r F_{\phi}) - {\partial F_{r} \over \partial \phi}) \hat{\theta} + {1 \over r} ({1 \over \sin \phi} {\partial F_{r} \over \partial \theta} - {\partial \over \partial r} (r F_{\theta})) \hat{\phi}
    • \nabla^{2} f = div(\nabla f)
      • = {1 \over r^{2}} {\partial \over \partial r} (r^{2} {\partial f \over \partial r}) + {1 \over r^{2} \sin^{2} \phi} {\partial^{2} f \over \partial \theta^{2}} + {1 \over r^{2} \sin \phi} {\partial \over \partial \phi}(\sin \phi {\partial f \over \partial \phi})
  • 좌표계와 무관한 div, curl의 정의
    • div \vec{F} = \lim_{v \to 0} {1 \over v} \int_{\partial v} \vec{F} \cdot d\vec{A}
    • curl \vec{F} = \lim_{v \to 0} {1 \over v} \int_{\partial v} \vec{F} \times d\vec{A}

러셀 서양철학사/ 요한네스 스코투스의 사상

  • 요한네스 스코투스는 아일랜드인으로서 신플라톤 학파에 속한 학자이자, 펠라기우스주의자이자 범신론자였음.
  • 그는 이성과 계시 사이에 충돌이 일어나는 듯 보인다면, 이성을 우위에 두어야 한다고 주장함.
  • 요한네스의 가장 위대한 작품은 <자연 구분론>
    • 이 책에서 ‘개념 실재론’ 이라고 할만한 견해를 제시함.
  • 그는 ‘자연’ 속에 존재 뿐만 아니라 비존재도 포함시켰음.
  • 자연 전체는 4가지 부류로 구분
    • 창조하지만 창조되지 않는 존재 -> 신
    • 창조하면서 창조되는 존재 -> 플라톤의 이상들
    • 창조되지만 창조하지 못하는 존재 -> 시공간 속의 사물들
    • 창조하지도 못하고 창조 되지도 않는 존재 -> 신
  •  신에게서 흘러나온 만물은 그에게로 돌아가려 분투한다. 따라서 만물의 종말은 만물의 시작과 동일하다.일자와 다자를 잇는 다리가 바로 신의 말씀(Logos)이다.
  • 죄의 근원은 자유에 있다. 죄란 인간이 신에게 향하지 않고 자기 자신에게 관심을 돌리기 때문에 발생했다.
  • 악의 근거가 신 안에 있지 않은 까닭은 신 안에 악의 이상은 존재하지 않기 때문이다.
  • 악은 비존재이고 근거가 없는데, 그 까닭은 만약 악에 근거가 있다면 악도 필연적인 존재가 되기 때문. 악은 선의 결핍일 뿐이다.
  • 신의 말씀은 다자를 일자로 돌아가게 하고 인간을 신에게 돌아가게 하는 원리이다.
  • 요한네스는 아리스토텔레스 지지자들의 입장에 동의하지 않고 개별 사물의 실체성을 부인함.
  • 요한네스 체계에서 존재의 넷째 부류에 속하는 창조하지도 창조되지도 않는 존재는 만물은 신에게로 돌아간다는 디오니시오스의 학설에서 유래 함.
  • 요한네스가 번역한 디오니시오스의 저술은 중세 사상에 큰 영향을 미쳤으나, 자연의 구분을 다룬 그의 대작은 영향력이 미미했음.

러셀 서양철학사/ 암흑기의 교황 체제

  • 교황 체제는 그레고리우스 대교황부터 실베스테르 2세에 이르는 4세기 동안 영고성쇠를 거듭함.
    • 8, 9세기에 의욕이 넘치는 교황들은 절호의 기회를 잡아 교황 권력의 전통을 형성해 나감.
  • 교황들은 자신의 노력이 아니라 롬바르드족 군대의 힘으로 그리스 황제들로부터 독립을 쟁취함.
    • 그리스의 교회는 대체로 황제에게 복종하고, 황제는 주교나 총대주교를 임명하고 폐할 자격이 있다고 생각 함.
    • 수도자들은 황제의 지배에서 벗어나 독립하려 했고 이 때문에 교황의 편을 들었음.
    • 반면 콘스탄티노플의 총대주교들은 황제에는 복종하였지만, 교황의 권위에는 복종할 생각이 없었음.
  • 동방 교회와 서방 교회가 분리된 주된 원인은 동방 교회가 교황의 지배권에 저항한 사건.
  • 7세기에도 황제의 군사력이 로마를 지배했기 때문에 교황들은 복종하거나 수난의 길을 걸어야 했음.
  • 751년 롬바르드족이 비잔틴 제국의 이탈리아 수도 라벤나를 점령함으로써 교황은 그리스 황제들에게 의존하던 종속 관계에서 벗어남.
    • 롬바르드족이 739년 로마 정복을 꾀하자 교황은 프랑크 왕국에 원조를 요청하고 위기를 벗어남.
  • 처음부터 주교들은 모두 동등하다고 생각했으며 동방에서도 이러한 견해는 받아들여져서 알렉산드리아, 안티오크, 예루살렘 등 동방에는 다른 총대주교들이 있었던 반면, 교황은 서방의 유일한 총대주교였음.
    • 동방과 달리 서방의 속인들은 대부분 수세기 동안 읽고 쓸 줄 몰랐기 떄문에 서방 교회는 여러 이점을 누림.
    • 황제의 특권은 교황의 특권에 대적할 정도였지만, 서방의 군주 가운데 어느 누구도 교황에 견줄만한 특권을 누리지 못함.
  • 샤를마뉴는 롬바르드족을 완전히 물리치고 왕으로 인정 받은 다음 로마에서 교황이 거행한 대관식을 통해 황제로 즉위함.
    • 이는 황제와 교황 모두에게 이익이 되었음.
    • 사를마뉴는 자기 주장의 합법성을 교황으로부터 이끌어냄. 이로써 교황과 황제 사이에 이상한 의존 관계가 형성되었는데, 어느 누구도 로마 교황의 대관식을 거치지 않고서는 황제가 될 수 없었던 반면, 황제는 교황을 임명하고 폐할 권리를 주장함.
  • 샤를마뉴 죽음 이후 카롤링거 왕조가 쇠퇴하고 제국이 분열되기 시작한 초기 상황은 교황 체제에 유리하게 작용함.
    • 교황 니콜라우스 1세는 이전 어느 때보다 교황 권력을 강화함.
    • 그는 동방과 서방의 황제들, 거의 모든 그리스도교 나라의 주교단과 다퉜는데 거의 모든 싸움에서 승리함.
  • 10세기 내내 로마의 지방 귀족들이 교황직을 장악하였는데, 그 무렵까지 교황의 선출 방식을 정하는 규칙은 존재하지 않았음.
  • 서기 1000년은 이슬람교도와 북방 야만족이 서유럽 침략을 중단했다는 이유로 전환점이 됨.