En el procesamiento de imágenes , el método de umbralización de histograma equilibrado (BHT), [1] es un método muy simple que se utiliza para el umbral de imagen automático . Al igual que el método de Otsu [2] y el método de umbral de selección iterativa , [3] este es un método de umbral basado en histogramas . Este enfoque asume que la imagen se divide en dos clases principales: el fondo y el primer plano . El método BHT intenta encontrar el nivel de umbral óptimo que divide el histograma en dos clases.
Este método pesa el histograma, verifica cuál de los dos lados es más pesado y elimina el peso del lado más pesado hasta que se vuelve más liviano. Repite la misma operación hasta que los bordes de la balanza se encuentran.
Dada su simplicidad, este método es una buena opción como primer enfoque al presentar el tema del umbral automático de imagen .
Algoritmo
La siguiente lista, en notación C , es una versión simplificada del método de umbral de histograma equilibrado :
int BHThreshold ( int [] histograma ) { i_m = ( int ) (( i_s + i_e ) / 2.0f ); // centro de la balanza I_m w_l = get_weight ( i_s , i_m + 1 , histograma ); // peso a la izquierda W_l w_r = get_weight ( i_m + 1 , i_e + 1 , histograma ); // peso a la derecha W_r while ( i_s <= i_e ) { if ( w_r > w_l ) { // el lado derecho es más pesado w_r - = histograma [ i_e - ]; si ((( i_s + i_e ) / 2 ) < i_m ) { w_r + = histograma [ i_m ]; w_l - = histograma [ i_m - ]; } } else if ( w_l > = w_r ) { // el lado izquierdo es más pesado w_l - = histograma [ i_s ++ ]; if ((( i_s + i_e ) / 2 ) > = i_m ) { w_l + = histograma [ i_m + 1 ]; w_r - = histograma [ i_m + 1 ]; i_m ++ ; } } } return i_m ; }
A continuación, se muestra una posible implementación en el lenguaje Python :
def bht ( hist , min_count : int = 5 ) -> int : "" "Umbral de histograma equilibrado." "" n_bins = len ( hist ) # asume histograma 1D h_s = 0 mientras que hist [ h_s ] < min_count : h_s + = 1 # ignorar pequeños recuentos al inicio h_e = n_bins - 1 mientras hist [ h_e ] < min_count : h_e - = 1 # ignorar pequeños recuentos al final # usar la intensidad media del histograma como centro; alternativamente: (h_s + h_e) / 2) h_c = int ( round ( np . promedio ( np . linspace ( 0 , 2 ** 8 - 1 , n_bins ), pesos = hist ))) w_l = np . sum ( hist [ h_s : h_c ]) # peso en la parte izquierda w_r = np . sum ( hist [ h_c : h_e + 1 ]) # peso en la parte derecha while h_s < h_e : if w_l > w_r : # la parte izquierda se hizo más pesada w_l - = hist [ h_s ] h_s + = 1 else : # la parte derecha se hizo más pesada w_r - = hist [ h_e ] h_e - = 1 new_c = int ( round ( ( h_e + h_s ) / 2 )) # volver a centrar la balanza if new_c < h_c : # mover bin al otro lado 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 volver h_c
Referencias
- ^ A. Anjos y H. Shahbazkia. Umbral de imagen de dos niveles: un método rápido. BIOSIGNALS 2008. Vol: 2. P: 70-76.
- ^ Nobuyuki Otsu (1979). "Un método de selección de umbral a partir de histogramas de nivel de gris". IEEE Trans. Sys., Man., Cyber. 9: 62–66.
- ^ Ridler TW, Calvard S. (1978) Imagen de umbral mediante un método de selección iterativo, IEEE Trans. Sistema, hombre y cibernética, SMC-8: 630-632.