Python-이론/python-opencv

[OpenCV-python] adaptive Threshold

sang_hoony 2018. 6. 6. 01:59

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보다는 정확히 아이언맨의 선을 표현하고 있다.