Main Content

multithresh

Establecer umbrales de varios niveles en una imagen usando el método de Otsu

Descripción

ejemplo

thresh = multithresh(A) devuelve el valor de umbral único thresh calculado para la imagen A usando el método de Otsu. Puede utilizar thresh como un argumento de entrada para que imquantize convierta una imagen en una imagen de dos niveles.

ejemplo

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

ejemplo

[thresh,metric] = multithresh(___) devuelve metric, una medida de la efectividad de los umbrales calculados.

Ejemplos

contraer todo

Lea y muestre una imagen.

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

Figure contains an axes object. The axes object contains an object of type image.

Calcule un solo valor de umbral para la imagen.

level = multithresh(I);

Segmente la imagen en dos regiones utilizando la función imquantize, especificando el nivel de umbral devuelto por la función multithresh. Muestre el resultado.

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

Figure contains an axes object. The axes object contains an object of type image.

Lea una imagen, conviértala en escala de grises y muestre el resultado.

I = imread("foggysf2.jpg");
I = rgb2gray(I);
imshow(I)
title("Grayscale Image")

Figure contains an axes object. The axes object with title Grayscale Image contains an object of type image.

Calcule dos niveles de umbral.

thresh = multithresh(I,2);

Segmente la imagen en tres niveles utilizando la función imquantize.

labels = imquantize(I,thresh);

Convierta la imagen segmentada en una imagen en color utilizando la función label2rgb y muestre la imagen.

labelsRGB = label2rgb(labels);
imshow(labelsRGB)
title("Segmented Image")

Figure contains an axes object. The axes object with title Segmented Image contains an object of type image.

Lea y muestre una imagen RGB.

I = imread("peppers.png");
imshow(I) 
title("RGB Image");

Figure contains an axes object. The axes object with title RGB Image contains an object of type image.

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

threshRGB = multithresh(I,7);

Genere umbrales para cada plano de la imagen RGB.

threshForPlanes = zeros(3,7);			

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

Procese la imagen completa con el conjunto de valores de los umbrales calculados a partir de la imagen completa.

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

Procese cada plano RGB por separado utilizando el vector umbral calculado a partir del plano dado. Cuantifique 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 ambas imágenes posterizadas y observe las diferencias visuales en los dos esquemas de uso de los umbrales.

montage({quantRGB,quantPlane}) 
title("Full RGB Image Quantization vs. Plane-by-Plane Quantization")

Figure contains an axes object. The axes object with title Full RGB Image Quantization vs. Plane-by-Plane Quantization contains an object of type image.

Para comparar los resultados, calcule el número de vectores de píxeles RGB únicos en cada imagen de salida. Tenga en cuenta que el esquema de uso de umbrales plano a plano produce aproximadamente un 23% más de colores que el esquema de la imagen RGB completa.

dim = size(quantRGB);
quantRGBmx3 = reshape(quantRGB,prod(dim(1:2)),3);
quantPlanemx3 = reshape(quantPlane,prod(dim(1:2)),3);

colorsRGB = unique(quantRGBmx3,"rows");
disp("Unique colors in RGB image: "+length(colorsRGB));
Unique colors in RGB image: 188
colorsPlane = unique(quantPlanemx3,"rows");
disp("Unique colors in plane-by-plane image: "+length(colorsPlane));
Unique colors in plane-by-plane image: 231

Lea una imagen.

I = imread('circlesBrightDark.png');

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

uniqLevels = unique(I(:));  

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

Calcule una serie de umbrales para valores crecientes monotónicamente 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 usando imquantize.

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

     1
     2
     3
     4
     5
     6
     7
     8
     9

Umbralice la imagen utilizando seg_Neq8 como una entrada para multithresh. Establezca N igual a 8, que es 1 menos que el número de niveles de 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

Umbralice de nuevo la imagen, esta vez aumentando el valor de N en 1. Este valor ahora es igual al número de niveles de la imagen. Observe cómo se degenera la entrada dado que el número de niveles de la imagen es muy bajo para el número de umbrales solicitados. Por lo tanto, multithresh 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 desea umbralizar, especificada como arreglo numérico de cualquier dimensión. multithresh encuentra los umbrales basados en el histograma agregado de todo el arreglo. multithresh considera una imagen RGB como un arreglo numérico 3D y calcula los umbrales para los datos combinados a partir 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 usado en posteriores cálculos. multithresh ignora cualquier NaNs en los cálculos. Cualquier Infs y -Infs se cuentan en el primer y en el último bin del histograma, respectivamente.

En entradas degeneradas donde el número de valores únicos en A es inferior o igual a N, no existe una solución viable usando el método de Otsu. En este tipo de entradas, el valor de retorno thresh contiene todos los valores únicos de A y, posiblemente, algunos valores adicionales que se eligen de manera arbitraria.

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

Número de valores de umbral, especificado como entero positivo. 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 garantiza únicamente resultados óptimos localmente. Como la posibilidad de converger con el óptimo local aumenta con N, es preferible utilizar valores más pequeños que N, normalmente N < 10. El valor máximo permitido para N es 20.

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

Argumentos de salida

contraer todo

Conjunto de valores de umbral utilizado para cuantificar una imagen, devuelto como vector numérico de 1 por N, cuyo tipo de datos es el mismo que la imagen A.

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

Medida de la efectividad de los umbrales, devuelta como un número en el intervalo [0, 1]. Los valores altos indican una mayor efectividad de los umbrales al separar la imagen de entrada en N + 1 clases de acuerdo con el criterio objetivo de Otsu. En entradas degeneradas donde el número de valores únicos en A es inferior 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

Historial de versiones

Introducido en R2012b

Consulte también

| | |