Balanserad histogramtröskel
Inom bildbehandling är den balanserade histogramtröskelmetoden (BHT), en mycket enkel metod som används för automatisk bildtröskelvärde . Liksom Otsus metod och Iterative Selection Thresholding Method är detta en histogrambaserad tröskelmetod. Detta tillvägagångssätt förutsätter att bilden är uppdelad i två huvudklasser: bakgrunden och förgrunden . BHT - metoden försöker hitta den optimala tröskelnivån som delar histogrammet i två klasser.
Denna metod väger histogrammet, kontrollerar vilken av de två sidorna som är tyngre och tar bort vikten från den tyngre sidan tills den blir lättare. Den upprepar samma operation tills kanterna på vågen möts .
Med tanke på dess enkelhet är denna metod ett bra val som ett första tillvägagångssätt när man presenterar ämnet automatisk bildtröskel .
Algoritm
Följande listning, i C- notation, är en förenklad version av metoden Balanced Histogram Thresholding :
int BHT-tröskel ( int [] histogram ) { i_m = ( int )(( i_s + i_e ) / 2.0f ); // mitten av vägningsskalan I_m w_l = get_weight ( i_s , i_m + 1 , histogram ); // vikt till vänster W_l w_r = get_weight ( i_m + 1 , i_e + 1 , histogram ); // vikt till höger W_r while ( i_s <= i_e ) { if ( w_r > w_l ) { // höger sida är tyngre 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 ) { // vänster sida är tyngre 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 ++ ; } } } returnera i_m ; }
Följande är en möjlig implementering i Python -språket:
0
0
def bht ( hist , min_count : int = 5 ) -> int : """Balanserad histogramtröskel.""" n_bins = len ( hist ) # antar 1D histogram h_s = medan hist [ h_s ] < min_count : h_s += 1 # ignorera små räkningar vid start h_e = n_bins - 1 medan hist [ h_e ] < min_count : h_e -= 1 # ignorera små räkningar i slutet # använd histogrammets medelintensitet som centrum; alternativt: (h_s + h_e) / 2) h_c = int ( rund ( np . medelvärde ( np . linspace ( , 2 ** 8 - 1 , n_bins ), vikter = hist ))) w_l = np . summa ( hist [ h_s : h_c ]) # vikt i den vänstra delen w_r = np . summa ( hist [ h_c : h_e + 1 ]) # vikt i höger del medan h_s < h_e : if w_l > w_r : # vänster del blev tyngre w_l -= hist [ h_s ] h_s += 1 annat : # höger del blev tyngre w_r -= hist [ h_e ] h_e -= 1 new_c = int ( rund (( h_e + h_s ) / 2 )) # centrera om vågskålen om new_c < h_c : # flytta behållaren till andra sidan w_l -= hist [ h_c ] w_r += hist [ h_c ] elif new_c > h_c : w_l += hist [ h_c ] w_r -= hist [ h_c ] h_c = new_c return h_c