티스토리 뷰

반응형
[영상처리] 적응형 Treshold (OpenCV)

적응형 Threshold란?

지난 게시물에서 otsu algorithm(thresholding) 에 대해 알아봤다. 이는 하나의 고정된 값으로 thresholding 하는 것인데, 영상의 조명이 일정하지 않거나 배경색이 여러가지인 경우에는 하나의 고정된 threshold로는 좋은 결과를 얻지 못한다. 그래서 이미지를 여러 영역으로 나눈 후에 그 주변 픽셀 값을 기준으로 계산하여 영역마다의 threshold를 지정한다. 이것을 적응형 threshold(Adaptive threshold)라고 한다.

OpenCV에서 제공하는 Adaptive Threshold

cv2.adaptiveThreshold(srcmaxValueadaptiveMethodthresholdTypeblockSizeC)

Parameters: • src – grayscale image • maxValue – 임계값 • adaptiveMethod – thresholding value를 결정하는 계산 방법(mean, gaussian 방식) • thresholdType – threshold 방법 • blockSize – thresholding을 적용할 영역 사이즈, 홀수(3, 5, 7, ...) • C – 계산된 경계 값(평균이나 가중평균)에서 차감할 값

AdptiveMethod

  • Mean방식은 지정된 영역의 이웃 픽셀의 평균으로 threshold를 결정하는 방법
  • Gaussian 방식은 가우시안 분포에 따른 가중치의 합으로 threshold를 결정하는 방법

샘플 코드

import cv2
import matplotlib.pyplot as plt

block_size = 9
C = 5
img = cv2.imread('imgs/adaptive_threshold.png', cv2.IMREAD_GRAYSCALE)

ret, th1 = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)
th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, block_size, C)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, block_size, C)

imgs = {'Original': img, f'Global-Otsu:{ret}': th1,
        'Adapted-Mean':th2, 'Adapted-Gaussian': th3}

for i, (k, v) in enumerate(imgs.items()):
    plt.subplot(2, 2, i+1)
    plt.imshow(v, 'gray')
    plt.title(k)
    plt.xticks([])
    plt.yticks([])
plt.show()

결과 영상

위 결과 영상에서 볼 수 있듯이 Otsu 알고리즘은 하나의 값으로 thresholding하는 것으로 영상의 조명이 달라지는 부분은 모두 없어졌다. 하지만 Adaptive Thresholding(Mean, Gaussian)을 적용한 영상은 훨씬 좋은 결과를 보인다.

참고자료

[도서] 파이썬으로 만드는 OpenCV 프로젝트

[OpenCV] 공식문서

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday