Contenido principal

imquantize

Cuantificar una imagen utilizando niveles de cuantificación y valores de salida especificados

Descripción

quant_A = imquantize(A,levels) cuantifica la imagen A utilizando los valores de cuantificación especificados que se incluyen en el vector levels de N elementos. La imagen de salida cuantificada quant_A tiene el mismo tamaño que A y contiene N+1 valores enteros discretos en el intervalo 1 a N+1. Los valores enteros están determinados por los siguientes criterios:

  • Si A(k)levels(1), quant_A(k) = 1.

  • Si levels(m–1) < A(k)levels(m), quant_A(k) = m.

  • Si A(k) > levels(N), quant_A(k) = N+1.

ejemplo

quant_A = imquantize(A,levels,values) especifica el valor de cuantificación asignado a los píxeles.

  • Si A(k)levels(1), quant_A(k) = values(1).

  • Si levels(m–1) < A(k)levels(m), quant_A(k) = values(m).

  • Si A(k) > levels(N), quant_A(k) = values(N+1).

ejemplo

[quant_A,index] = imquantize(___) devuelve un arreglo index de manera que:

quant_A = values(index)

ejemplo

Ejemplos

contraer todo

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 hidden 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 hidden 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 hidden 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 hidden 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

Reduzca el número de niveles discretos en una imagen de 256 a 8. Este ejemplo utiliza dos métodos diferentes para asignar valores a cada uno de los ocho niveles de salida.

Lea una imagen y muéstrela.

I = imread('coins.png');
imshow(I) 
axis off
title('Grayscale Image')

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

Divida la imagen en ocho niveles obteniendo siete umbrales con la función multithresh.

thresh = multithresh(I,7);

Construya el vector valuesMax de tal manera que el valor máximo en cada intervalo de cuantificación se asigne a los ocho niveles de la imagen de salida.

valuesMax = [thresh max(I(:))]
valuesMax = 1×8 uint8 row vector

    65    88   119   149   169   189   215   255

[quant8_I_max, index] = imquantize(I,thresh,valuesMax);

Del mismo modo, construya el vector valuesMin de tal manera que el valor mínimo en cada intervalo de cuantificación se asigne a los ocho niveles de la imagen de salida. En lugar de volver a llamar a imquantize con el vector valuesMin, utilice el índice del argumento de salida para asignar esos valores a la imagen de salida.

valuesMin = [min(I(:)) thresh]
valuesMin = 1×8 uint8 row vector

    23    65    88   119   149   169   189   215

quant8_I_min = valuesMin(index);

Muestre ambas imágenes de salida con ocho niveles una al lado de la otra.

imshowpair(quant8_I_min,quant8_I_max,'montage') 
title('Minimum Interval Value           Maximum Interval Value')

Figure contains an axes object. The hidden axes object with title Minimum Interval Value Maximum Interval Value contains an object of type image.

Argumentos de entrada

contraer todo

Imagen de entrada, especificada como arreglo numérico de cualquier dimensión.

Niveles de cuantificación, especificados como vector numérico de longitud N. Los valores de los niveles de cuantificación discretos deben estar en orden creciente monotónicamente.

Valores de cuantificación, especificados como vector numérico de longitud N+1.

Argumentos de salida

contraer todo

Imagen cuantificada, devuelta como arreglo numérico del mismo tamaño que A. Si se especifica el argumento de entrada values, quant_A es del mismo tipo de datos que values. De lo contrario, quant_A es del tipo de datos double.

Arreglo de asignación, devuelto como arreglo numérico del mismo tamaño que la imagen de entrada A. El arreglo contiene índices enteros que acceden a values para crear la imagen de salida: quant_A = values(index). Si no especifica el argumento de entrada values, index = quant_A.

Tipos de datos: double

Capacidades ampliadas

expandir todo

Generación de código de GPU
Genere código CUDA® para GPU NVIDIA® mediante GPU Coder™.

Historial de versiones

Introducido en R2012b

expandir todo

Consulte también

| |