균형 히스토그램 임계값 지정
Balanced histogram thresholding이미지 처리에서 균형 히스토그램 임계값 지정 방법([1]BHT)은 자동 이미지 임계값 지정에 사용되는 매우 간단한 방법이다.오쓰의 방법이나[2] 반복 선택 임계값 방식과 마찬가지로 히스토그램 기반 임계값 방식이다.[3]이 접근방식은 이미지가 두 가지 주요 클래스로 구분된다고 가정한다.배경과 전경.BHT 방법은 히스토그램을 두 클래스로 나누는 최적의 임계값 레벨을 찾으려고 한다.
히스토그램의 무게를 재어 양쪽 중 어느 쪽이 더 무거운지 확인한 뒤 라이터가 될 때까지 무거운 쪽에서 무게를 뺀 방식이다.체중계의 가장자리가 만날 때까지 같은 동작을 반복한다.
단순성을 고려할 때, 이 방법은 자동 영상 임계값 지정의 주제를 제시할 때 첫 번째 접근법으로서 좋은 선택이다.
알고리즘.
다음 목록은 C 표기법으로 균형 잡힌 히스토그램 임계값 지정 방법의 단순화된 버전이다.
인트로 BHThreshold(인트로[] 히스토그램) { i_m = (인트로)((i_s + i_e) / 2.0f); // 체중계 I_m의 중심 w_l = get_weight(i_s, i_m + 1, 히스토그램); // 왼쪽 W_l에 무게 w_r = get_weight(i_m + 1, i_e + 1, 히스토그램); // 오른쪽 W_r에 무게 하는 동안에 (i_s <= i_e) { 만일 (w_r > w_l) { // 오른쪽이 더 무겁다. w_r -= 히스토그램[i_e--]; 만일 (((i_s + i_e) / 2) < i_m) { w_r += 히스토그램[i_m]; w_l -= 히스토그램[i_m--]; } } 다른 만일 (w_l >= w_r) { // 왼쪽이 더 무겁다. w_l -= 히스토그램[i_s++]; 만일 (((i_s + i_e) / 2) >= i_m) { w_l += 히스토그램[i_m + 1]; w_r -= 히스토그램[i_m + 1]; i_m++; } } } 돌아오다 i_m; }
Python 언어로 가능한 구현은 다음과 같다.
반항하다 bht(히스, min_count: 인트로 = 5) -> 인트로: """균형 히스토그램 임계값 조정.""" n_bins = 렌(히스) # 1D 히스토그램 가정 h_s = 0 하는 동안에 히스[h_s] < min_count: h_s += 1 # 시작 시 작은 카운트 무시 h_e = n_bins - 1 하는 동안에 히스[h_e] < min_count: h_e -= 1 # 마지막에 작은 카운트 무시 # 히스토그램의 평균 강도를 중심으로 사용; 대안으로: (h_s + h_e) / 2) h_c = 인트로(둥글게(np.평균의(np.빈 공간(0, 2 ** 8 - 1, n_bins), 역기=히스))) w_l = np.합계를 내다(히스[h_s:h_c]) # 왼쪽 무게 w_r = np.합계를 내다(히스[h_c : h_e + 1]) # 오른쪽 무게 하는 동안에 h_s < h_e: 만일 w_l > w_r: # 왼쪽 부분이 무거워졌다. w_l -= 히스[h_s] h_s += 1 다른: # 오른쪽 부분이 무거워졌다. w_r -= 히스[h_e] h_e -= 1 new_c = 인트로(둥글게((h_e + h_s) / 2)) # 체중계의 중심을 다시 잡는다. 만일 new_c < h_c: # 빈을 반대편으로 옮긴다. w_l -= 히스[h_c] w_r += 히스[h_c] 엘리프 new_c > h_c: w_l += 히스[h_c] w_r -= 히스[h_c] h_c = new_c 돌아오다 h_c