Articulo de referencia

Umbralización de histograma equilibrada

En el procesamiento de imágenes , el método de umbralización de histograma balanceado (BHT) [ 1 ] es un método muy simple que se utiliza para la umbralización automática de imág...

En el procesamiento de imágenes , el método de umbralización de histograma balanceado (BHT) [ 1 ] es un método muy simple que se utiliza para la umbralización automática de imágenes . Al igual que el método de Otsu [ 2 ] y el método de umbralización de selección iterativa [ 3 ], este es un método de umbralización 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.

Imagen original.
Imagen umbralizada.
Evolución del método.

Este método pesa el histograma, comprueba cuál de los dos lados pesa más y le quita peso al lado más pesado hasta que se convierta en el más ligero. 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 acercamiento al presentar el tema del umbral automático de imágenes .

Algoritmo

El siguiente listado, en notación C , es una versión simplificada del método de umbralización de histograma balanceado :

int BHThreshold ( int [] histogram ) { i_m = ( int )(( i_s + i_e ) / 2.0f ); // centro de la báscula I_m w_l = get_weight ( i_s , i_m + 1 , histogram ); // peso en la izquierda W_l w_r = get_weight ( i_m + 1 , i_e + 1 , histogram ); // peso en la derecha W_r while ( i_s <= i_e ) { if ( w_r > w_l ) { // el lado derecho es más pesado 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 ) { // el lado izquierdo es más pesado 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 ; }

A continuación se muestra una posible implementación en el lenguaje Python :

def balanced_histogram_thresholding ( histogram , minimum_bin_count : int = 5 , jump : int = 1 ) -> int : """  Determina un umbral óptimo equilibrando el histograma de una imagen,  centrándose en los bins del histograma significativos para segmentar la imagen en dos partes. Argumentos:  histogram (lista): El histograma de la imagen como una lista de enteros,  donde cada elemento representa el recuento de píxeles  en un nivel de intensidad específico.  minimum_bin_count (int): Recuento mínimo para que un bin se considere en el  proceso de umbralización. Los bins con recuentos inferiores a este  valor se ignoran, lo que reduce el efecto del ruido.  jump (int): Tamaño del paso para ajustar el umbral durante la iteración. Los valores mayores  aceleran la convergencia, pero pueden omitir el umbral óptimo. Devuelve:  int: El valor umbral calculado. Este valor representa el nivel de intensidad  (es decir, el índice del histograma de entrada) que mejor separa las  partes significativas del histograma en dos grupos, que pueden interpretarse como primer plano  y fondo.  Si la función devuelve -1, indica que el algoritmo no pudo encontrar  un umbral adecuado dentro de las restricciones (por ejemplo, todos los bins están por debajo de  minimum_bin_count).  """ # Encuentra los índices de inicio y fin donde los bins del histograma son significativos start_index = 0 while start_index < len ( histogram ) and histogram [ start_index ] < minimum_bin_count : start_index += 1end_index = len ( histogram ) - 1 mientras end_index >= 0 y histogram [ end_index ] < minimum_bin_count : end_index -= 1# Comprobar si no se encuentran contenedores válidos if start_index >= end_index : return - 1 # Indica un error o no aplicabilidad# Inicializar umbral umbral = ( índice_inicio + índice_fin ) // 2# Ajustar iterativamente el umbral mientras start_index <= end_index : # Calcular los pesos a ambos lados del umbral weight_left = sum ( histogram [ start_index : threshold ]) weight_right = sum ( histogram [ threshold : end_index + 1 ])# Ajustar el umbral en función de los pesos si peso_izquierdo > peso_derecho : índice_inicio += salto elif peso_izquierdo < peso_derecho : índice_fin -= salto else : # Pesos iguales; mover ambos índices índice_inicio += salto índice_fin -= salto# Calcular el nuevo umbral umbral = ( índice_inicio + índice_fin ) // 2umbral de retorno

Referencias

  1. A. Anjos y H. Shahbazkia. Umbralización de imágenes de dos niveles: un método rápido. BIOSIGNALS 2008. Vol.: 2. Págs.: 70-76.
  2. Nobuyuki Otsu (1979). "Un método de selección de umbral a partir de histogramas de niveles de gris". IEEE Trans. Sys., Man., Cyber. 9: 62–66.
  3. Ridler TW, Calvard S. (1978) Umbralización de imágenes mediante un método de selección iterativo, IEEE Trans. System, Man and Cybernetics, SMC-8: 630-632.