画像処理において、バランスヒストグラム閾値法(BHT)[ 1 ]は、画像の自動閾値設定に用いられる非常にシンプルな手法です。大津法[ 2 ]や反復選択閾値法[ 3 ]と同様に、 BHTはヒストグラムに基づく閾値設定法です。この手法では、画像が背景と前景の2つの主要なクラスに分割されていると仮定します。BHT法は、ヒストグラムを2つのクラスに分割する最適な閾値レベルを見つけようとします。



この方法は、ヒストグラムの重さを量り、両側のどちらが重いかを調べ、重い側が軽くなるまで重量を減らしていきます。この操作を、計量器の端が合うまで繰り返します。
この方法はシンプルであるため、自動画像しきい値設定というテーマを提示する際の最初のアプローチとして適しています。
アルゴリズム
次のリストは、C表記で、バランス ヒストグラムしきい値設定法の簡略化されたバージョンです。
int BHThreshold ( int [] histogram ) { i_m = ( int )(( i_s + i_e ) / 2.0f ); // 体重計の中心 I_m w_l = get_weight ( i_s , i_m + 1 , histogram ); // 左側の重量 W_l w_r = get_weight ( i_m + 1 , i_e + 1 , histogram ); // 右側の重量 W_r while ( i_s <= i_e ) { if ( w_r > w_l ) { // 右側の方が重いw_r -= histogram [ i_e -- ]; if ((( i_s + i_e ) / 2 ) < i_m ) { w_r += histogram [ i_m ]; w_l -= histogram [ i_m -- ]; } } else if ( w_l >= w_r ) { // 左側が重いw_l -= histogram [ i_s ++ ]; if ((( i_s + i_e ) / 2 ) >= i_m ) { w_l += histogram [ i_m + 1 ]; w_r -= histogram [ i_m + 1 ]; i_m ++ ; } } } return i_m ; }以下は、 Python言語で可能な実装です。
def balanced_histogram_thresholding ( histogram , minimum_bin_count : int = 5 , jump : int = 1 ) -> int : """ 画像のヒストグラムのバランスを取り、 重要なヒストグラムビンに焦点を当てて画像を 2 つの部分に分割することで、最適なしきい値を決定します。 引数: histogram (リスト): 画像のヒストグラムを整数のリストとして表します。各要素は 特定の強度レベルの ピクセル数を表します。minimum_bin_count (整数): 閾値処理で考慮されるビンの最小カウント 。この 値を下回るカウントを持つビンは無視され、ノイズの影響を軽減します。jump (整数): 反復処理中に閾値を調整するためのステップサイズ。値を大きくする と収束が速くなりますが、最適な閾値をスキップする可能性があります。 戻り値: int: 計算された閾値。この値は、 ヒストグラムの 重要な部分を前景 と背景として解釈できる2つのグループに最もよく分離する強度レベル(つまり、入力ヒストグラムのインデックス)を表します。 関数が-1を返す場合、アルゴリズムが 制約内で適切な閾値を見つけられなかったことを示します(例:すべてのビンが minimum_bin_countを下回っている場合)。 """ # ヒストグラムビンが重要な開始インデックスと終了インデックスを検索start_index = 0 while start_index < len ( histogram ) and histogram [ start_index ] < minimum_bin_count : start_index += 1end_index = len ( histogram ) - 1ですが、end_index >= 0かつhistogram [ end_index ] < minimum_bin_count : end_index -= 1 です。# 有効なビンが見つからないかどうかを確認しますif start_index >= end_index : return - 1 # エラーまたは適用不可を示します# しきい値を初期化するthreshold = ( start_index + end_index ) // 2# start_index <= end_indexの間、しきい値を反復的に調整します。# しきい値の両側の重みを計算します。weight_left = sum ( histogram [ start_index : threshold ] ) weight_right = sum ( histogram [ threshold : end_index + 1 ])# 重みに基づいてしきい値を調整します。if weight_left > weight_right : start_index + = jump elif weight_left < weight_right : end_index -= jump else : # 重みは等しく、両方のインデックスを移動します。start_index + = jump end_index -= jump# 新しいしきい値を計算します。threshold = ( start_index + end_index ) // 2返品しきい値