적응형 이진화

지난 포스팅에서 Otsu지역 이진화를 적용 했을 때 다음과 같은 결과물을 얻는 것을 확인했다.

Otsu나 지역 이진화를 통한 방법은 모든 이미지에서, 특히 이미지가 서로 다른영역에서 다른 밝기값을 가질 때 잘 수행되지 않는다. 이러한 경우 적응형 이진화를 진행할 수 있다.

적응형 이진화란 이미지의 각 픽셀에 대해 개별적으로 임계값을 설정하는 방법으로, 대상 픽셀의 주변 픽셀들을 기반으로 결정된다. 따라서 이미지의 다른 영역에 대해 서로 다른 임계값을 적용하므로 배경의 밝기가 다양한 이미지에서 잘 동작하게 된다.

위와 같은 이미지가 있다고 가정하자. 블록 하나는 하나의 픽셀을 의미 한다.

픽셀 P13에 대한 임계값을 임의로 설정해보자.

  1. 우선 주변 인접 픽셀영역을 설정해야한다. 이를 블록크기(blockSize)라고 하자.
  2. 픽셀 P13에 대해 블록크기를 5로 설정하면 위 그림처럼 P13을 중심으로 하는 5*5 블록이 설정된다.(파란색 블록 영역) 
  3. P1~P25 영역에 대한 평균값 또는 가우시안 필터를 통한 가중치 평균값을 구하도록 한다.
  4. 평균값에서 임의의 상수 C를 뺀 값이 임계값으로 설정된다.
  5. 설정된 임계값으로 P13에 이진화를 적용한다.
    예) P13 = if(P13 > T) 255 else 0

모든 픽셀에 대해 위 1~5 과정을 반복하는 것이 적응형 이진화의 결과물이 된다.

OpenCV에서는 이 과정을 adaptiveThreshold라는 함수로 제공한다.

Imgproc.adaptiveThreshold(
    Mat src, Mat dst, 
    double maxValue, 
    int adaptiveMethod, 
    int thresholdType, 
    int blockSize, 
    double C
)
src : 입력 영상
dst : 출력 영상
maxValue : 임계값의 최대치(보통 255로 설정)
adaptiveMethod : 블록 평균 계산 방법 지정.
    ADAPTIVE_THRESH_MEAN_C는 산술 평균, 
    ADAPTIVE_THRESH_GAUSSIAN_C는 가우시안 가중치 평균을 적용

thresholdType : THRESH_BINARY or THRESH_BINARY_INV
blockSize : 블록크기, 최소 3이상의 홀수
C : 블록 내 평균값에서 뺄 값, (0, 음수, 양수 모두 지정 가능)

이제 adaptiveThreshold를 적용하여 스도쿠 이미지에 이진화를 적용해보자.

adaptiveMethod는 ADAPTIVE_THRESH_GAUSSIAN_C,
C값은 0으로 설정하고 블록 크기만 바꿔가며 이진화를 진행한 결과는 다음과 같다.

 

TL;DR

OpenCV의 adaptiveThreshold 함수를 사용하여 적응형 이진화를 수행하고, 원하는 결과물을 얻었다.

적응형 이진화는 모든 픽셀에 대해 임계값을 계산한다. 그리고 블록크기가 커지면 연산량이 늘어나기 때문에 Otsu나 지역 이진화보다 상대적으로 연산속도가 느리다. 그러므로 상황에 맞게 적절한 이진화 알고리즘을 선택해야 한다.

Buy me a coffeeBuy me a coffee
카테고리: AndroidOpenCV

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.