K 개발자
스레시홀딩 본문
스레시홀딩
스레시홀딩(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 : 계산된 경계 값 결과에서 가감할 상수(음수 가능)
Comments