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 1 por N que contiene valores de umbral mediante 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(___) devoluciones, una medida de la eficacia de los umbrales calculados. está en el rango y un valor más alto indica una mayor eficacia de los umbrales para separar la imagen de entrada en regiones basadas en el criterio objetivo de Otsu.metricmetric[0 1]N + 1

Ejemplos

contraer todo

Lea la imagen y muésela.

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

Calcular un valor de umbral único para la imagen.

level = multithresh(I);

Segmente la imagen en dos regiones mediante , especificando el nivel de umbral devuelto por .imquantizemultithresh

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

Lea la imagen y muésela.

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

Calcular dos niveles de umbral.

thresh = multithresh(I,2);

Segmente la imagen en tres niveles utilizando .imquantize

seg_I = imquantize(I,thresh);

Convierta la imagen segmentada en imagen a color con y muéstrala.label2rgb

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

Lea la imagen truecolor (RGB) y muésela.

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

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 toda la imagen.

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

Procese cada plano RGB por separado utilizando el vector de umbral calculado desde el plano dado. Cuantifique 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);

Muestre ambas 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íxeles 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');

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

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

Calcular una serie de umbrales en valores de aumento monótona 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 a .seg_Neq8multithresh Establezca igual a 8, que es 1 menor 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 1.N Este valor ahora es igual 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 pocos 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 va a umbral, especificada como una matriz numérica real y no dispersa 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 3D 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 cálculos posteriores. ignora cualquier en el cálculo.multithreshUn[min(A(:)) max(A(:))]multithreshNaNs Cualquiera y se cuentan en la primera y última bandeja del histograma, respectivamente.Infs-Infs

Para las entradas degeneradas donde el número de valores únicos en es menor o igual que , no hay ninguna solución viable utilizando el método de Otsu.UnN Para estas 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 entero positivo. Para , 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 solo garantiza resultados localmente óptimos. Dado que la posibilidad de converbir a local óptimo aumenta con , es preferible utilizar valores más pequeños de , típicamente .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, devuelto como un vector 1 por N, cuyo tipo de datos es el mismo que image .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 rango.Ungraythresh[0, 1]

Medición de la eficacia de los umbrales, devuelta como valor escalar. Los valores más altos indican una mayor eficacia 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 que , 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