multithresh
Establecer umbrales de varios niveles en una imagen usando el método de Otsu
Descripción
devuelve el valor de umbral único thresh
= multithresh(A
)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.
devuelve thresh
= multithresh(A
,N
)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.
Ejemplos
Segmentar una imagen en dos regiones
Lea una imagen y muéstrela.
I = imread('coins.png');
imshow(I)
Calcule un solo valor de umbral para la imagen.
level = multithresh(I);
Segmente la imagen en dos regiones mediante imquantize
, especificando el nivel de umbral devuelto por multithresh
.
seg_I = imquantize(I,level); figure imshow(seg_I,[])
Segmentar una imagen en tres niveles utilizando dos umbrales
Lea una imagen y muéstrela.
I = imread('circlesBrightDark.png'); imshow(I) axis off title('Original Image')
Calcule 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 una imagen a color utilizando label2rgb
y muéstrela.
RGB = label2rgb(seg_I); figure; imshow(RGB) axis off title('RGB Segmented Image')
Comparar el uso de umbrales con imágenes completas frente el uso de umbrales plano a plano
Lea una imagen en color verdadero (RGB) y muéstrela.
I = imread('peppers.png'); imshow(I) axis off title('RGB 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.
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 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' ); 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
Comprobar resultados utilizando el argumento de salida metric
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
A
— Imagen que se desea umbralizar
Arreglo numérico
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
— Número de valores de umbral
1
(predeterminado) | entero positivo
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
thresh
— Conjunto de valores de umbral
Vector numérico de 1 por N
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].
metric
— Medida de la efectividad
Número 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
Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.
Notas y limitaciones de uso:
multithresh
es compatible con la generación de código C (requiere MATLAB® Coder™). Tenga en cuenta que, si selecciona la plataforma objetivo genéricaMATLAB Host Computer
,multithresh
genera código que utiliza una biblioteca compartida precompilada específica de la plataforma. El uso de una biblioteca compartida mantiene las optimizaciones de rendimiento, pero limita las plataformas objetivo para las que se puede generar código. Para obtener más información, consulte Types of Code Generation Support in Image Processing Toolbox.El argumento de entrada
N
debe ser una constante en tiempo de compilación.
Generación de código de GPU
Genere código CUDA® para GPU NVIDIA® mediante GPU Coder™.
Notas y limitaciones de uso:
El argumento de entrada
N
debe ser una constante en tiempo de compilación.
Historial de versiones
Introducido en R2012b
Consulte también
graythresh
| imquantize
| im2bw
| rgb2ind
Abrir ejemplo
Tiene una versión modificada de este ejemplo. ¿Desea abrir este ejemplo con sus modificaciones?
Comando de MATLAB
Ha hecho clic en un enlace que corresponde a este comando de MATLAB:
Ejecute el comando introduciéndolo en la ventana de comandos de MATLAB. Los navegadores web no admiten comandos de MATLAB.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)