Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

multithresh

Umbrales de imagen multinivel usando el método de Otsu

Sintaxis

thresh = multithresh(A)
thresh = multithresh(A,N)
[thresh,metric] = multithresh(___)

Descripción

ejemplo

thresh = multithresh(A) Devuelve el valor de umbral único thresh calculado para A de imagen utilizando el método de Otsu. Puede utilizar thresh como argumento de entrada para imquantize para convertir una imagen en una imagen de dos niveles.

ejemplo

thresh = multithresh(A,N) Devuelve thresh un vector 1 por N que contiene valores de umbral N mediante el método de Otsu. Puede utilizar thresh como argumento de entrada en imquantize para convertir A de imagen en una imagen con N + 1 niveles discretos.

ejemplo

[thresh,metric] = multithresh(___) Devuelve metric, una medida de la efectividad de los umbrales calculados. metric está en la gama [0 1] y un valor más alto indica una mayor eficacia de los umbrales en la separación de la imagen de entrada en las regiones N + 1 basadas en el criterio objetivo de Otsu.

Ejemplos

contraer todo

Leer la imagen y mostrarla.

I = imread('coins.png'); imshow(I)

Calcule un único valor de umbral para la imagen.

level = multithresh(I);

Segmentar la imagen en dos regiones utilizando imquantize , especificando el nivel de umbral devuelto por multithresh .

seg_I = imquantize(I,level); figure imshow(seg_I,[])

Leer la imagen y mostrarla.

I = imread('circlesBrightDark.png'); imshow(I) axis off title('Original Image')

Calcule dos niveles de umbral.

thresh = multithresh(I,2);

Segmenta la imagen en tres niveles usando imquantize .

seg_I = imquantize(I,thresh);

Convertir la imagen segmentada en imagen de color usando label2rgb y mostrarla.

RGB = label2rgb(seg_I);    figure; imshow(RGB) axis off title('RGB Segmented Image')

Lea la imagen de TrueColor (RGB) y muestrela.

I = imread('peppers.png'); imshow(I)  axis off title('RGB Image');

Genere umbrales para siete niveles a partir de toda la imagen RGB.

threshRGB = multithresh(I,7);

Generar umbrales para cada plano de la imagen RGB.

threshForPlanes = zeros(3,7);     for i = 1:3     threshForPlanes(i,:) = multithresh(I(:,:,i),7); end

Procese toda la imagen con el conjunto de valores de umbral calculados a partir de toda la imagen.

value = [0 threshRGB(2:end) 255];  quantRGB = imquantize(I, threshRGB, value);

Procese cada plano RGB por separado utilizando el vector umbral calculado desde el plano dado. Cuantificar cada plano RGB utilizando el vector umbral generado para ese plano.

quantPlane = zeros( size(I) );  for i = 1:3     value = [0 threshForPlanes(i,2:end) 255];      quantPlane(:,:,i) = imquantize(I(:,:,i),threshForPlanes(i,:),value); end  quantPlane = uint8(quantPlane);

Muestre las imágenes posterizadas y observe las diferencias visuales en los dos esquemas de umbral.

imshowpair(quantRGB,quantPlane,'montage')  axis off title('Full RGB Image Quantization        Plane-by-Plane Quantization')

Para comparar los resultados, calcule el número de vectores de píxel RGB únicos en cada imagen de salida. Tenga en cuenta que el esquema de umbrales plano por plano rinde un 23% más de colores que el esquema completo de imagen RGB.

dim = size( quantRGB ); quantRGBmx3   = reshape(quantRGB,   prod(dim(1:2)), 3); quantPlanemx3 = reshape(quantPlane, prod(dim(1:2)), 3);  colorsRGB   = unique(quantRGBmx3,   'rows' ); colorsPlane = unique(quantPlanemx3, 'rows' );  disp(['Unique colors in RGB image            : ' int2str(length(colorsRGB))]);
Unique colors in RGB image            : 188 
disp(['Unique colors in Plane-by-Plane image : ' int2str(length(colorsPlane))]);
Unique colors in Plane-by-Plane image : 231 

Leer imagen.

I = imread('circlesBrightDark.png');

Encuentre todos los valores únicos de escala de grises en imagen.

uniqLevels = unique(I(:));    disp(['Number of unique levels = ' int2str( length(uniqLevels) )]);
Number of unique levels = 148 

Calcule una serie de umbrales en los valores monotónico crecientes de N.

Nvals = [1 2 4 8]; for i = 1:length(Nvals)     [thresh, metric] = multithresh(I, Nvals(i) );     disp(['N = ' int2str(Nvals(i)) '  |  metric = ' num2str(metric)]); end
N = 1  |  metric = 0.54767 N = 2  |  metric = 0.98715 N = 4  |  metric = 0.99648 N = 8  |  metric = 0.99902 

Aplique el conjunto de 8 valores de umbral para obtener una segmentación de 9 niveles utilizando imquantize .

seg_Neq8 = imquantize(I,thresh); uniqLevels = unique( seg_Neq8(:) )
uniqLevels = 9×1

     1
     2
     3
     4
     5
     6
     7
     8
     9

Umbral de la imagen utilizando seg_Neq8 como una entrada a multithresh. Establecer N igual a 8, que es 1 menos que el número de niveles en esta imagen segmentada. multithresh devuelve un valor metric de 1.

[thresh, metric] = multithresh(seg_Neq8,8)
thresh = 1×8

    1.8784    2.7882    3.6667    4.5451    5.4549    6.3333    7.2118    8.1216 ⋯

metric = 1 

Umbral de la imagen de nuevo, esta vez aumentando el valor de N por 1. Este valor ahora equivale al número de niveles de la imagen. Observe cómo la entrada es degenerada porque el número de niveles en la imagen es demasiado pequeño para el número de umbrales solicitados. Por lo tanto, multitrilla devuelve un valor metric de 0.

[thresh, metric] = multithresh(seg_Neq8,9)
Warning: No solution exists because the number of unique levels in the image are too few to find 9 thresholds. Returning an arbitrarily chosen solution. 
thresh = 1×9

     1     2     3     4     5     6     7     8     9

metric = 0 

Argumentos de entrada

contraer todo

Imagen que se debe umbralar, especificada como una matriz numérica real y no Sparsa de cualquier dimensión. multithresh encuentra los umbrales basados en el histograma agregado de toda la matriz. multithresh considera una imagen RGB como un array numérico tridimensional y calcula los umbrales para los datos combinados de los tres planos de color.

multithresh utiliza el rango de la imagen de entrada A, [min(A(:)) max(A(:))], como los límites para calcular el histograma utilizado en los cálculos posteriores. multithresh omite cualquier NaNs en el cálculo. Cualquier Infs y -Infs se contabilizan en el primer y último contenedor del histograma, respectivamente.

Para entradas degeneradas donde el número de valores únicos en A es menor o igual a N, no existe una solución viable utilizando el método de Otsu. Para tales entradas, el valor devuelto thresh contiene todos los valores únicos de A y posiblemente algunos valores adicionales que se eligen arbitrariamente.

Ejemplo: I = imread('cameraman.tif'); thresh = multithresh(I);

Tipos de datos: single | double | int16 | uint8 | uint16

Número de valores de umbral, especificados como valor escalar de enteros positivos. Para N > 2, multithresh utiliza la optimización basada en la búsqueda del criterio de Otsu para encontrar los umbrales. La optimización basada en la búsqueda sólo garantiza resultados óptimos localmente. Puesto que la posibilidad de converger a los aumentos óptimos locales con N, es preferible utilizar valores más pequeños de N, típicamente N < 10. El valor máximo permitido para N es 20.

Ejemplo: thresh = multithresh(I,4);

Tipos de datos: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Argumentos de salida

contraer todo

Conjunto de valores umbral utilizados para cuantificar una imagen, devuelto como un vector 1 por N, cuyo tipo de datos es el mismo que Ade imagen.

Estos umbrales están en el mismo rango que la imagen de entrada A, a diferencia de la función graythresh , que devuelve un umbral normalizado en el rango [0, 1].

Medida de la efectividad de los umbrales, devueltos como valor escalar. Los valores más altos indican una mayor efectividad de los umbrales al separar la imagen de entrada en clases N+1 basadas en el criterio objetivo de Otsu. Para entradas degeneradas donde el número de valores únicos en A es menor o igual a N, metric es igual a 0.

Tipos de datos: double

Referencias

[1] Otsu, N., "A Threshold Selection Method from Gray-Level Histograms," IEEE Transactions on Systems, Man, and Cybernetics, Vol. 9, No. 1, 1979, pp. 62-66.

Capacidades ampliadas

Consulte también

| | |

Introducido en R2012b