ML/Computer Vision

Thresholding

young_3060 2023. 7. 4. 11:29
728x90

💡딥러닝에서의 thresholding

더보기

- 딥러닝에서의 thresholding : 분류 기준

default value = 0.5

precision(정밀도 = tp/tp+fp)가 높을 수록 thresholding도 높다.

threshold(분류기준) 기준으로 그 이상이면 1이라고 예측(분류)한다.

따라서 분류기준이 높을수록 더 정밀하게 예측한다.

 

반대로 Recall(재현율 = tp/tp+fn)을 높이면 threshold가 낮아진다.

 

 

이미지 processing에서 자주 활용되는 이미지 Thresholding은 분류 기준값을 의미, 그 기준값을 기준으로 작으면 0 크면 1로 분류된다.

OpenCV 이미지 프로세싱에서 thresholding을 적용하려면 grayscale 이미지로 변환해서 적용한다.

 

📌 Global Thresholding

OpenCV에서 하나의 이미지에 전역으로 적용될 하나의 분류 기준 값을 이용해 thresholding 기능을 제공하는 함수

cv2.threshold(img, threshold_value, value, flag)
'''
img : grayscale image
threshold_value : pixel threshold value
flag : threshold value 적용 방법 또는 스타일
-> cv2.THRESH_BINARY : 픽셀 값이 threshold_value 보다 크면 value, 작으면 0 할당
-> cv2.THRESH_BINARY_INV : 픽셀 값이 threshold_value 보다 크면 0, 작으면 vlaue 할당
-> cv2.THRESH_TRUNC : 픽셀 값이 threshold_value 보다 크면 threshold_value, 작으면 픽셀값 할당
-> cv2.THRESH_TOERO : 픽셀 값이 threshold_value 보다 크면 픽셀값, 작으면 0 할당
-> cv2.THRESH_TOZERO_INV : 픽셀 값이 threshold_value 보다 크면 0, 작으면 픽셀값 할당
'''

 

📌 Adaptive Thresholding

global thresholding은 이미지 전반에 하나의 값만 활용하는 함수였다. 하지만 이런 방법은 이미지 각 부분의 광원 조건에 따라 효과적인 이미지 프로세싱이 안 될 수도 있다.

Adaptive Thresholding은 이미지의 서로 다른 작은 영역에 적용되는 thresholding value를 계산하고 이를 적용해 보다 나은 결과를 도출해 낼 수 있다.

cv2.adaptiveThreshold(img, value, adaptiveMethod, thresholdType, blocksize, C)
'''
img : grayscale image
value : 픽셀에 적용될 최대값
adaptiveMethod : method 함수
-> cv2.ADAPTIVE_THRESH_MEAN_C : threshold value = 적용할 픽셀 (x,y)를 중심으로 하는 blocksize*blocksize 안에 있는 픽셀값의 평균에서 C를 뺀 값
-> cv2.ADAPTIVE_THRESH_GAUSSIAN_C : threshold value = 적용할 픽셀 (x,y)를 중심으로 blocksize*blocksize 안에 있는 Gaussian 윈도우 기반 가중치들의 합에서 C를 뺀 값
thresholdType : global에서의 함수 중 두개만 사용가능
-> cv2.THRESH_BINARY : 픽셀 값이 threshold_value 보다 크면 value, 작으면 0 할당
-> cv2.THRESH_BINARY_INV : 픽셀 값이 threshold_value 보다 크면 0, 작으면 vlaue 할당

blocksize : 픽셀에 적용할 threshold value를 계산하기 위한 블럭 크기. 적용될 픽셀이 블럭의 중심이 되므로 반드시 홀수여야함
C : 보정상수, 양수면 계산된 adaptive threshold value에서 빼고, 음수면 더함. 0이면 그대로
'''

 

📌 Otsu's Binarization

global thresholding에서 가장 좋은 결과를 내놓게 될 thresholding value를 구하려면?

if) 이미지 히스토그램이 두개의 봉우리를 가지는 bimodal image 일때, 이 이미지의 thresholding value는 두 봉우리 사이의 값을 취하면 가장 좋은 결과일 것이다.

 

=> Otsu Binarization은 이미지 히스토그램을 분석한 후 중간값을 취하여 thresholding 한다.

cv2.threshold(img, 0, 255, cv.THRESH_BINARY+cv2.THRESH_OTSU)
# cv2.threshold 함수에 cv2.THRESH_OTSU 플래그 값을 더하고 threshold value를 0으로 전달해주면된다.

📎 Gaussian blur을 적용하면 확실한 봉우리를 만들고, 여기에 Otsu 알고리즘을 적용하여 threshold value를 구한 후 thresholding을 적용하면 보다 나은 노이즈 제거를 할 수 있음을 볼 수 있다.

 

📕 결론 : Thresholding 기법과 blur 필터를 활용하면 이미지 노이즈 제거에 효과적이다.

 

 

< 참고 >

https://m.blog.naver.com/samsjang/220504782549

 

[10편] 이미지 Thresholding

이미지 프로세싱 & 컴퓨터 비전 OpenCV-Python 강좌 10편 : 이미지 Thresholding 배우기 필요환경...

blog.naver.com

 

728x90