[OpenCV-python] adaptive Threshold

2018. 6. 6. 01:59Python-이론/python-opencv

adaptive Threshold 


global Threshold는 문턱 값을 하나의 이미지 전체에 적용시키는 반면 adaptive Threshold는 이미지의 구역구역마다 threshold를 실행 시켜주는 것이다. 그럼 아래의 함수를 보자 


cv2.adaptiveThreshold(img, value, adaptivemethod, thresholdType, blocksize, C)


img: grayscale 이미지

value: adaptivemethod에 의해 계산된 문턱 값과 thresholdType에 의해 픽셀에 적용될 최대 값 

adaptive method: 사용할 문턱값 계산 알고리즘 


cv2.ADAPTIVE_THRESH_GAUSSIAN_C: X, Y를 중심으로 block Size * block Size 안에 있는 픽셀 값의 평균에서 C를 뺸 값을 문턱값으로 함 


cv2.ADAPTIVE_THRESH_MEAN_C: X, Y를 중심으로 block Size * block Size 안에 있는 Gaussian 윈도우 기반 가중치들의 합에서 C를 뺀 값을 문턱값으로 한다. 


blocksize: block * block size에 각각 다른 문턱값이 적용된다. 


C: 보정 상수로서 adaptive에 계산된 값에서 양수면 빼주고 음수면 더해준다. 



import cv2

img = cv2.imread('images/ironMan.PNG', cv2.IMREAD_GRAYSCALE)

ret, origin = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
thr1 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
thr2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

cv2.imshow('global threshold', origin)
cv2.imshow('GAUSSIAN_C', thr1)
cv2.imshow('MEAN_C', thr2)

cv2.waitKey(0)
cv2.destroyAllWindows()



확실히 단순한 global threshold보다는 정확히 아이언맨의 선을 표현하고 있다.