영상 이진화(binarization, thresholding)

영상처리 2014.01.07 15:41

영상처리에서의 이진화를 주제로 몇몇 알고있는 내용들을 정리해 봅니다.


영상처리에서 이진화(binarization)는 매우 간단한 연산중의 하나이지만 단순한 만큼 쉽지 않은 문제이기도 합니다.


알다시피 이진화 문제는 two class classification 문제로서 0 아니면 1, 흑 아니면 백, 모 아니면 도(?) 와 같이 대상을 일괄적으로 둘 중 하나의 값으로 분류해 버리는 것입니다.



1. 전역 고정 이진화(Global fixed thresholding)


영상처리에서 이진화는 어떤 주어진 임계값(threshold)보다 밝은 픽셀들은 모두 흰색으로, 그렇지 않은 픽셀들은 모두 검은색으로 바꾸는 것을 지칭한다.


아래 예는 이진화 문제 중 가장 단순한 형태로서 균일한 밝기를 갖는 배경과 물체에 약간의 노이즈를 섞어서 생성한 영상이다.


<그림 1>


그림 1에서 (a)는 원본 영상, (b)는 픽셀들의 밝기값 히스토그램, (c)는 이진화 결과영상이다. 히스토그램에서 볼 수 있듯이 배경영역은 약 100 정도의 밝기값을, 물체는 150 근처의 밝기값 분포를 갖는다. 따라서 임계값(threshold)을 T = 125 정도로 주고 이진화를 했을 때 (c)처럼 가장 좋은 이진화 결과를 기대할 수 있다.


여기서 문제는 임계값 T를 어떻게 자동으로 결정할 것인가이다.


이론적으로 봤을 때 이진화에 따른 분류(classification) 에러를 최소화시켜주는 임계값을 optimal threshold라고 부른다. 즉, 어떤 T값 하나를 고정했을 때 T보다 어두운 물체 픽셀의 비율과 T보다 밝은 배경픽셀의 비율의 합을 최소화해주는 T를 optimal threshold라고 부른다 (물체가 배경보다 밝다고 했을 경우). 하지만 이것은 어디까지는 이론적인 목표, 지향점을 나타낼 뿐 실제 임계값을 구하는 방법을 제시하는 것은 아니다. T가 optimal인지 여부를 알려면 어떤 픽셀이 물체이고 배경인지를 사전에 알고 있어야 하기 때문이다. 하지만 이걸 미리 알고 있었다면 이미 최적의 이진화가 끝난 상태이므로 T를 구할 필요가 없다.


실제 입력 영상의 밝기 분포를 보고 임계값을 찾아주는 가장 실질적인 방법으로는 Otzu's method가 있다 (N. Otsu, “A threshold selection method from gray-level histograms,” IEEE Trans. Syst., Man, Cybern., vol. SMC-9, pp. 62-66, 1979).


Otsu의 이진화 방법은 임계값 T를 기준으로 영상 픽셀들을 두 클래스로 분류했을 때 두 클래스간의 intra-class variance를 최소화하거나 또는 inter-class variance를 최대화하는 T를 찾는 이진화 방법이다.


입력 영상에서 임계값 T보다 어두운 픽셀들의 비율을 α, 밝기 평균을 μ1, 분산을 σ12, T보다 밝은 픽셀들의 비율을 β, 밝기 평균을 μ2, 분산을 σ22라 했을 때 (α+β=1), intra-class 분산과 inter-class 분산은 각각 다음과 같이 계산된다.


intra-class variance = ασ12+βσ22     --- (1)


inter-class variance = αβ(μ1-μ2)2     --- (2)


식 (1)을 최소화시키는 것은 식 (2)를 최대화시키는 것과 동일하며 둘 중 어느 기준을 사용해도 무방하지만 계산상으로는 식 (2)를 최대화시키는 것이 효율적이다. 즉, Otsu의 이진화 알고리즘은 임계값 T를 0 부터 255까지 단계적으로 변화시키면서 식 (2)를 계산하고 식 (2)가 최대가 되는 T 값을 찾아서 영상을 이진화하는 방법이다.



2. 지역 가변 이진화 I (Locally adaptive thresholding)


문제에 따라서는 아래 예와 같이 하나의 임계값(threshold) 만으로는 어떤 값을 주어도 정확한 이진화가 힘든 경우가 있다.


<그림 2>


그림 2(a)는 흰 종이에 낙서를 한 후에 웹캠으로 촬영한 영상인데 조명 변화 등으로 인해 영상 전체적으로 밝기 변화가 심한 형태로서 그림 2(b) 히스토그램에서 볼 수 있듯이 배경과 물체의 밝기 분포가 서로 상당부분 겹쳐 있는 경우이다. 이 경우에는 어떤 임계값을 사용해도 물체와 배경이 명확하게 구분되지 않는다.


이러한 경우에는 하나의 고정된 threshold 값으로는 이진화가 불가능하며 픽셀 위치마다 서로 다른 threshold를 사용하는 가변 thresholding 기법이 필요하다.


<그림 3>


그림 3은 배경의 밝기 변화를 일차 평면(ax+by+c=0)을 이용하여 근사하여 제거한 결과 이미지를 보여준다(평면근사 방법에 대해서는 최소자승법 이해와 다양한 활용예 (Least Square Method) 글 참조). 배경의 밝기 변화가 제거된 영상은 히스토그램을 그려보면 아래 그림과 같이 배경 영역과 낙서 영역의 밝기값이 잘 분리가 되어서 깨끗한 이진 결과 영상을 얻을 수 있다.


<그림 4>


위의 이진화 과정은 얼핏 global thresholding처럼 보이지만 사실은 원래 입력 영상 관점에서 봤을 때 local adaptive thresholding이 적용된 것이다. 위 과정을 다시 살펴보면 배경의 밝기 변화가 심한 영상에서 먼저 밝기 변화를 제거한 후 밝기 보정된 영상에 대해 global thresholding을 적용한 것이다. 그러나, 이를 원래 영상 관점에서 보면 배경의 밝기를 근사한 평면에 상수값을 더한 것을 threshold 평면으로 볼 수 있고 이 threshold 평면에 대해 직접 이진화를 수행한 것으로 해석할 수 있다.



3. 지역 가변 이진화 II (Locally adaptive thresholding)


사실 위에 설명한 방법은 이진화에 따른 어려움, 특성을 설명하기 위한 하나의 예이고 실용적인 관점에서 간단하면서도 효과적인 방법은 픽셀 주변의 local 영역의 밝기 평균을 임계값으로 사용하는 방법이다 (비전 라이브러리인 OpenCV에 adaptiveThreshold라는 이름의 함수로 제공)


이 방법은 영상 픽셀마다 서로 다른 threshold를 사용하는데, 그 threshold 값은 그 픽셀을 중심으로 한 n x n 주변 영역의 밝기 평균에 일정한 상수를 빼서 결정한다.



주변 영역의 크기를 어떻게 잡느냐와 상수 C를 어떻게 주느냐(+, - 모두 가능)에 따라서 결과가 달라질 수 있으며 문제에 따라서 적절히 값을 조정하면 좋은 이진화 결과를 얻을 수 있다.


아래 그림은 그림 2의 원본 이미지에 local 밝기 평균을 임계값으로 사용하여 이진화한 결과를 보여준다 (n=73, C=10을 사용).



<그림 5>



4. Hysteresis(히스테레시스) thresholding


이진화 문제는 결국 어떤 값이 있을 때 이 값이 A 클래스인지 B 클래스인지 둘 중 하나로 분류하는 것인데 그 경계가 모호한 경우가 많다. 예를 들어 영상에서 어떤 픽셀값이 p1 = 79, p2 = 81이고 임계값(threshold)이 T = 80이라고 하자. 이 경우 p1과 p2는 사실 큰 값의 차이가 없음에도 불구하고 이진화를 하게 되면 전혀 다른 클래스로 분류되게 된다. 이와 같이 경계에 걸친 모호한 값들에 대해서는 하나의 엄격한 기준을 적용하는 것 보다는 이진화 오류를 최소화하기 위해 자신의 값 뿐만 아니라 주변의(공간적 또는 시간적으로) 값을 같이 참조하는 것이 효과적이다.


Hysteresis thresholding은 주변의 분류 결과에 따라서 자신의 분류 결과가 달라질 수 있는 thresholding 기법으로서 Canny edge detector에 사용된 이진화 기법이 가장 대표적인 예이다. Hysteresis(히스테레시스)라는 용어는 위키피디아에는 "Hysteresis is the dependence of a system not only on its current environment but also on its past environment"로 설명되어 있다. 즉, hysteresis는 어떤 시스템의 상태가 자신의 현재 값 뿐만 아니라 과거 또는 주변의 값에 의존하는 현상을 지칭한다.


아래 그림은 edge 검출기 중에서 가장 성능이 좋은 것으로 알려진 Canny edge 검출기를 이용한 edge 검출 예이다(J. Canny, ”A computational approach to edge detection,” IEEE Trans. on PAMI, 8(6):679–698, 1986). 영상에서 에지(edge)를 검출하는 문제도 결국 어떤 픽셀이 edge 픽셀인지 아닌지를 결정하는 이진화 문제로 볼 수 있다.


<그림 6>


Canny edge 검출기에서는 입력 영상에 대해 먼저 Sobel 필터를 적용하여 각 픽셀에 대한 edginess를 계산한 후 다음과 같은 hysteresis thresholding 과정을 거쳐 최종적인 edge 픽셀 여부를 결정한다.

  1. high threshold와 low threshold의 두 개의 threshold 값이 존재하며 high threshold 이상의 edginess를 갖는 픽셀들은 무조건 edge 픽셀로 분류한다.
  2. low와 high 사이에 있으면서 이미 edge로 분류된 픽셀들과 연결되어(인접해) 있으면 edge 픽셀로 분류한다.
  3. 나머지 픽셀들(low threshold 이하이거나 high threshold 이하이면서 edge 픽셀과 연결되어 있지 않은 경우)은 모두 non edge 픽셀로 분류한다.


즉, hysteresis thresholding의 요점은 판단이 확실한 경우(low threshold 이하 또는 high threshold 이상)에는 그대로 이진화를 하되, 그 판단이 불확실한 경우에는 주변 상황을 보고 결정을 하는 것이다.


Hysteresis thresholding 기법은 edge 검출 문제뿐만 아니라 영상 이진화, 피부색 검출 등 모든 이진화 문제에 적용 가능하다. 예를 들어, 영상에서의 피부색 검출의 경우를 보면 먼저 확률이 매우 높은(high threshold) 색들을 피부색으로 분류한 후에 이들을 중심으로 이들과 인접하면서 일정 확률(low threshold) 이상인 픽셀들을 피부색 픽셀로 확장해 나가는 방식이 가능할 것이다.



5. 시간축이 고려된 이진화 문제


마지막으로 시간에 따라 어떤 대상의 분류 상태가 변할 수 있는 경우의 이진화 문제를 살펴보도록 하자.


우리가 어떤 대상에 대해 판단을 할 때 어느 한 순간의 한 값만을 보고 판단을 하는 것은 사실 오류 가능성이 높은 위험한 방법이다. 하지만 방법이 없다보니 어떤 임계값을 미리 정해놓고 관측된 값이 임계값보다 낮으면 A, 높으면 B 이런식으로 판단을 하게 된다. 그런데, 이 대상을 계속 관찰하다 보면 관측된 값이 어떤 때는 임계값보다 높고 또 어떤 때는 임계값보다 낮을 수도 있을 것이다. 이럴 때마다 그 분류가 계속 바뀐다면 결과적으로 매우 불안정한 시스템이 될 것이다.


 이런 경우에 생각할 수 있는 한 방법은 high와 low의 두 개의 임계값을 정해놓고 어떤 대상의 분류가 바뀌는 데에는 보다 엄격한 기준을 적용하는 것이다. 만일 어떤 대상의 관측값이 임계값 이하여서 A 클래스로 분류되었다고 하자. 이후 대상의 관측값이 high threshold 이하인 경우에는 계속 A 클래스로 분류하되, high threshold를 넘어서면 B 클래스로 분류를 바꾼다. 그리고 일단 B가 된 이후에는 관측값이 low threshold보다 낮게 나타난 경우에만 A로 분류를 변경하는 방식이다. 즉, 분류의 경계를 넘나들 때에는 그 방향에 따라서 서로 다른 문턱값을 적용하는 방식이다.


예를 들어보면 처음에 구름이 껴 있는 하늘을 보고 오늘은 그래도 날씨가 좋은 편이다라고 생각했는데 점점 먹구름이 끼는 것이다. 그래도 나는 오늘 날씨가 좋다라는 생각을 바꾸지 않았지만 결국 천둥과 소나기를 접하고 나서야 오늘은 날씨가 나쁘다라고 생각을 바꾼다. 그러다 점점 하늘이 개어서 날씨가 좋아졌지만 쉽사리 마음을 되돌리지 못하고 청명한 하늘과 시원한 솔바람을 맞기 전까지는 여전히 날씨가 나쁘다고 생각하는 식이다.




어찌보면 앞서 설명한 hysteresis 방법과 상당히 유사한 방식으로서 이 기법에 대해서 따로 명칭이 있는지는 잘 모르겠다 (어쩌면 이 기법 또한 hysteresis thresholding 방법중 하나인지도 모른다). 그 응용은 다양한 응용이 가능할 것이며 일례로 열화상 카메라로 감지한 이동체의 움직임을 보고 사람인지 아닌지를 판단하는 문제, 추적하는 대상의 속도나 궤적을 보고 대상을 분류하는 문제 등의 응용이 가능할 것이다.


☞ 예전부터 올리려고 생각했던 글을 이제야 올립니다. 글에서는 주로 영상처리 관점에서 내용을 다루었지만 기본 개념은 영상뿐만 아니라 일반적인 이진화 문제에도 그대로 적용될 수 있습니다. 최적의 해는 문제마다 다를 수 있지만 여러 방법들을 알고 있으면 최적의 해를 찾는데 도움이 되리라 생각합니다.


by 다크 프로그래머


저작자 표시 비영리 변경 금지
신고
  • 지나가는손 2014.01.07 16:17 신고 ADDR 수정/삭제 답글

    웹캠은 광원과 광량에 너무 민감해서 이진화가 생각대로 잘안되더라구요...
    참고할 것이 많네요^^

    • BlogIcon 다크pgmr 2014.01.07 18:37 신고 수정/삭제

      안녕하세요. 오랜만입니다 ^^. 새해 복 많이 받으세요.

  • BlogIcon 리얼릭 2014.01.08 16:03 신고 ADDR 수정/삭제 답글

    제가지금 matlab을 이용하여 영상의 이진화를 해야되는데
    아예 백지상태라 막막하네요...사진 보내드리면 좀 도와주실수있나요...??
    코딩부분 좀 도움받고싶습니다. ㅠ ㅠ Threshold 설정하는 부분도 어렵구요..

    • BlogIcon 다크pgmr 2014.01.08 17:15 신고 수정/삭제

      어떤 주제나 질문에 대한 의견은 드릴 수 있지만 직접적인 도움은 드리지 않습니다. 일단 개인적으로 관련 공부를 해 보시고 의문이 나는 부분에 대해서 댓글을 남겨주시기 바랍니다.

  • BlogIcon 신당기 2014.01.10 05:38 신고 ADDR 수정/삭제 답글

    오랜만입니다....자료조사중이어서요......
    다크님의 기운때문인지 지금은 방향을 잡았습니다. 3차원모델을 위해서도 결국은 보간을 해야 하더군요. Radial basis function interpolation.....근데 이놈을 따라가다보니 이미지변형에 닿게 되었습니다. 제 두번째 목표인 교정전에 미리 얼굴을 예상하는 것과 연결되더군요. 그래서 지금 RBF을 열공중입니다.
    저는 Iterative thresholding까지만 했었습니다. 그 나머지는 너무 어려워서요...그런데....지금은 이해된다는.....아주 놀랍습니다.
    그리고....캐니엣지가 이런 개념이었군요. 얼굴영역을 특정할때 응용할 수 있을 것 같네요. 역시나 다크님은 저같은 초보도 이해시키는 미라클입니다. 감사합니다.

    • BlogIcon 다크pgmr 2014.01.10 10:18 신고 수정/삭제

      무언가 열심히 하고 계실 것이라 생각하고 있었습니다 ^^
      저도 새해가 되서 그런지 좀더 의욕적으로 글도 쓰고 공부도 하고 있습니다. 예전에는 1년 하면 1년이다 라고 생각했는데 요즘은 365일중 벌써 10일이나 지났구나 하는 생각이 듭니다.
      RBF는 예전에 신경회로망(neural network)하면서 봤던 것 같은데 지금은 기억조차 가물가물합니다 ^^. 혹시 나중에 관련 글을 올려주시면 그때 보면서 배워야겠습니다.

  • 수제자 2014.01.10 22:44 신고 ADDR 수정/삭제 답글

    오늘은 시간이 되어 다크 프로그래머님의 블로그에 장시간 머무르게 되네요.. 항상 도움은 되지 못하고 이렇게 얻어만 가서 죄송할 뿐입니다. 대부분의 영상처리 책을 보면.. 이렇게 깊이 있게 까지 설명이 안되어 있는데,, 폭넓게 잘 이해되게 설명해 주셔서 감사합니다.
    즐거운 주말 되세요..^^

    • BlogIcon 다크pgmr 2014.01.13 12:01 신고 수정/삭제

      종종 시간이 되었으면 좋겠네요 ^^. 아마도 책에서는 책이라는 형식 때문에 어느정도 제약을 받지 않나 싶습니다. 그런 면에서 블로그는 제 내키는데로 표현할 수 있으니 참 좋은 것 같습니다.

  • 따옥 2014.02.03 14:31 신고 ADDR 수정/삭제 답글

    게이트웨이인가요?! ㅎㅎ 잘보고 갑니다.

    • BlogIcon 다크pgmr 2014.02.03 19:10 신고 수정/삭제

      네 세인트루이스 사진입니다 :)

    • 따옥 2014.02.06 01:02 신고 수정/삭제

      검색하다가 또 들렀습니다. 작년 여름 미주리주에 잠시 업무차 들른 적이 있는데 게이트웨이 혼자 다녀왔어서 더 반갑습니다. 지난주부터 영상처리 보구있어서. 종종 정보얻으러오겠습니다! ㅎ

    • BlogIcon 다크pgmr 2014.02.06 08:00 신고 수정/삭제

      네 종종 들러 주십시오 ^^

  • 다니카 2014.02.19 23:28 신고 ADDR 수정/삭제 답글

    좋은 정보 너무너무 감사합니다!!!

  • 루시엘 2014.06.03 10:30 신고 ADDR 수정/삭제 답글

    검색 하다가 Locally adaptive thresholding 를 보다 들르게 되었는데요 식을 보시면 x와 y부분에보시면 xi 와 yi 부분이 어느 값을 의미 하는지 잘 모르겠어서 그런데 알려주실수 있나요?

    • BlogIcon 다크pgmr 2014.06.04 08:57 신고 수정/삭제

      (x,y)는 우리가 threshold를 계산하고자 하는 픽셀좌표인데, threshold를 (x,y) 주변의 픽셀값들을 이용해서 계산합니다. 그 주변의 픽셀 좌표들을 (x+xi, y+yi)로 표현한 것입니다.

  • 요르디 2014.06.17 17:47 신고 ADDR 수정/삭제 답글

    좋은 정보 감사합니다. ^^

  • SCV 2014.11.25 16:47 신고 ADDR 수정/삭제 답글

    openCV에 관련해서 비디오 캡쳐한것을 바탕으로 RGB를 바이너리로 바꿔서 엣쥐 하려고 하는데요, 지금 막힌곳이 비디오 캡쳐를
    IplImage* ipmImage = cvCreateImage( cvSize(IPM_IMAGE_WIDTH,IPM_IMAGE_HEIGHT), IPL_DEPTH_8U, 3 ); // IPM Image
    CvCapture* capture = cvCaptureFromFile("road1.avi");
    avi에서 땃는데요, jpg파일로 된 것을 바이너리로 바꾸는건 할 수 있겟는데, C++자체에서 캡쳐한 정보를 가지고 바이너리로 바꾸려면 어떤식으로 해야하는지 감이 안잡혀서 ㅠ 질문드려요. 계속 공부하고 있는데,, 파일자체를 바꾸는 법은 공부했는데, 캡쳐한 것을 윈도우로 바로 띄우지 않고 바꾼다음 보내는 방법을 모르겟네요 ㅠㅠ

    • BlogIcon 다크pgmr 2014.11.25 18:22 신고 수정/삭제

      비디오 파일에서 이미지를 캡쳐하고 또 그레이칼라로 변환 및 이진화하는 과정에 대해서는 http://darkpgmr.tistory.com/46 글에 있는 함수들을 참조하시기 바랍니다.

  • BlogIcon kamchol 2014.12.11 21:59 신고 ADDR 수정/삭제 답글

    다크님자료를 매번 보고 있는데 이번 자료를 가져가서 사용 해도 될까요?

    • BlogIcon 다크pgmr 2014.12.12 09:20 신고 수정/삭제

      안녕하세요. 자료를 사용하신다는게 어떤 의미신지...
      개인적 참고용이라면 오프라인 파일로 보관해 주시고
      다른 블로그 글에 올리시는 것이라면 개인적 재해석 혹은 요약 정리가 들어간 것이라면 관계없습니다만 내용을 그대로 올리는 것이라면 링크를 걸어주시기 바랍니다.

  • 쏭양 2015.02.02 13:38 신고 ADDR 수정/삭제 답글

    안녕하세요.

    3. 지역 가변 이진화 II (Locally adaptive thresholding)

    여기서 수식이 나오는데 이 수식 출처가 어딘지 알 수 있을까요?

  • 티엘 2016.12.30 13:27 신고 ADDR 수정/삭제 답글

    안녕하세요. 혹시 영상의 선명도를 판단할 수 있는 방법은 없을까요?
    공장에서 렌즈 초점 조절이 잘못된 경우에 화면이 흐릿한 놈들이 있는데
    이런 경우 자동으로 분류해주고 싶은데
    아이디어가 별로 없네요.

    • BlogIcon 다크pgmr 2017.01.02 11:43 신고 수정/삭제

      저도 잘 모르겠습니다만 image contrast measure 등의 키워드로 검색해 보시면 좋을 것 같습니다. 참고로 이미지의 contrast는 그래디언트(gradient)에 키가 있는 것 같습니다.

    • 티엘 2017.01.02 15:05 신고 수정/삭제

      다크님, 답변 감사합니다.
      많은 도움이 되었습니다.
      Global Contrast Factor라는 수치를 이용해서 선명도를 검사하는 방법이 있는것 같아 확인중입니다.



티스토리 툴바