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 utilizando el método de Otsu

Descripción

ejemplo

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

ejemplo

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

ejemplo

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

Ejemplos

contraer todo

Leer la imagen y mostrarla.

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

Calcule un valor de umbral único para la imagen.

level = multithresh(I);

Segmenta la imagen en dos regiones usando, especificando el nivel de umbral devuelto por.imquantizemultithresh

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);

Convierta la imagen segmentada en imagen en color usando y mostrarla.label2rgb

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

Leer imagen TrueColor (RGB) y mostrarla.

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

Genere umbrales para siete niveles de toda la imagen RGB.

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 toda la imagen con el conjunto de valores de umbral 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 de umbral calculado a partir del plano dado. Cuantice cada plano RGB utilizando el vector de 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);

Visualice 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 umbral plano por plano produce aproximadamente un 23% más de colores que el esquema de imagen RGB completo.

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');

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

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

Calcule una serie de umbrales con valores monótonas 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 como entrada para.seg_Neq8multithresh Ajuste igual a 8, que es 1 menos que el número de niveles en esta imagen segmentada. Devuelve un valor de 1.Nmultithreshmetric

[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 por 1.N Este valor equivale ahora al número de niveles de la imagen. Observe cómo se degenera la entrada porque el número de niveles de la imagen es demasiado bajo para el número de umbrales solicitados. Por lo tanto, multithresh devuelve un valor de 0.metric

[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 thresholded, especificada como una matriz numérica no dispersa real de cualquier dimensión. encuentra los umbrales basados en el histograma agregado de toda la matriz. considera una imagen RGB como una matriz numérica 3-D y calcula los umbrales para los datos combinados de los tres planos de color.multithreshmultithresh

utiliza el rango de la imagen de entrada, como los límites para calcular el histograma utilizado en los cálculos posteriores. ignora cualquier en el cálculo.multithreshUn[min(A(:)) max(A(:))]multithreshNaNs Cualquiera y se cuentan en el primer y último bin del histograma, respectivamente.Infs-Infs

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

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

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

Número de valores de umbral, especificado como un valor escalar de entero positivo. For, utiliza la optimización basada en búsqueda del criterio de Otsu para encontrar los umbrales.N > 2multithresh La optimización basada en búsquedas garantiza solo resultados óptimos localmente. Dado que la posibilidad de convergen con aumentos óptimos locales con, es preferible utilizar valores más pequeños de, por lo general.NNN < 10 El valor máximo permitido para es 20.N

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 de umbral utilizados para cuantificar una imagen, devuelta como un vector de 1 por N, cuyo tipo de datos es el mismo que la imagen.Un

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

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

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