Python/OpenCV

스레시홀딩

ddingz 2022. 2. 28. 16:01

스레시홀딩

스레시홀딩(thresholding)이란 여러 점수를 커트라인을 기준으로 합격과 불합격으로 나누는 것처럼 여러 값을 경계점을 기준으로 두 가지 분류로 나누는 것으로, 바이너리 이미지를 만드는 가장 대표적인 방법이다.


전역 스레시홀딩

  • ret, out = cv2.threshold(img, threshold, value, type_flag)
    • img : NumPy 배열, 변환할 이미지
    • threshold : 경계 값
    • value : 경계 값 기준에 만족하는 픽셀에 적용할 값
    • type_flag : 스레시 홀드 적용 방법 지정
      • cv2.THRESH_BINARY : px > threshold ? value : 0, 픽셀 값이 경계 값을 넘으면 value를 지정하고, 넘지 못하면 0을 지정
      • cv2.THRESH_BINARY_INV : px > threshold ? 0 : value, cv2.THRESH_BINARY의 반대
      • cv2.THRESH_TRUNC : px > threshold ? value : px, 픽셀 값이 경계 값을 넘으면 value를 지정하고, 넘지 못하면 원래의 값 유지
      • cv2.THRESH_TOZERO : px > threshold ? px : 0, 픽셀 값이 경계 값을 넘으면 원래 값을 유지, 넘지 못하면 0을 지정
      • cv2.THRESH_TOZERO_INV : px > threshold ? 0 : px, cv2.THRESH_TOZERO의 반대
    • ret : 스레시홀딩에 사용한 경계 값
    • out : 결과 바이너리 이미지

오츠의 알고리즘

오츠의 알고리즘은 경계 값을 임의로 정해서 픽셀들을 두 부류로 나누고 두 부류의 명암 분포를 반복해서 구한 다음 두 부류의 명암 분포를 가장 균일하게 하는 경계 값을 선택한다.

e.g. ret, t_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)


적응형 스레시홀드

원본 영상에 조명이 일정하지 않거나 배경색이 여러 가지인 경우에는 아무리 여러 번 경계 값을 바꿔가며 시도해도 하나의 경계 값을 이미지 전체에 적용해서는 좋은 결과를 얻지 못한다.
이때는 이미지를 여러 영역으로 나눈 다음 그 주변 픽셀 값만 가지고 계산을 해서 경계 값을 구해야 하는데, 이것을 적응형 스레시홀드(adaptive threshold)라고 한다.

  • cv2.adaptiveThreshold(img, value, method, type_flag, block_size, C)
    • img : 입력 영상
    • value : 경계 값을 만족하는 픽셀에 적용할 값
    • method : 경계 값 결정 방법
      • cv2.ADAPTIVE_THRESH_MEAN_C : 이웃 픽셀의 평균으로 결정
      • cv2.ADAPTIVE_THRESH_GAUSSIAN_C : 가우시안 분포에 따른 가중치의 합으로 결정
    • type_flag : 스레시홀드 적용 방법 지정(cv2.threshold() 함수와 동일)
    • block_size : 영역으로 나눌 이웃의 크기(n × n), 홀수(3, 5, 7,…)
    • C : 계산된 경계 값 결과에서 가감할 상수(음수 가능)