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.

Encontrar vegetación en una imagen multiespectral

En este ejemplo se muestra cómo utilizar MATLAB® aritmética de matriz para procesar imágenes y trazar datos de imagen. En particular, este ejemplo funciona con una matriz de imágenes tridimensionaldonde donde los tres planos representan la señal de imagen de diferentes partes del espectro electromagnético, incluidos los canales rojos visibles y de infrarrojo cercano (NIR).

Las diferencias de datos de imagen se pueden utilizar para distinguir diferentes entidades de superficie de una imagen, que tienen reflectividad variable a través de diferentes canales espectrales. Al encontrar diferencias entre los canales rojos visibles y NIR, el ejemplo identifica las áreas que contienen vegetación significativa.

Paso 1: Importar canales infrarrojos de color desde un archivo de imagen multiespectral

Este ejemplo encuentra vegetación en una imagen de asignador temático LANDSAT que cubre parte de París, Francia, disponible por cortesía de Space Imaging, LLC. Siete canales espectrales (bandas) se almacenan en un archivo en el formato LAN de Erdas. El archivo LAN, , contiene una imagen de 7 canales 512 por 512 Landsat.paris.lan Un encabezado de 128 bytes va seguido de los valores de píxel, que se intercalan por línea (BIL) en orden de aumento del número de banda. Los valores de píxel se almacenan como enteros de 8 bits sin signo, en orden de bytes little-endian.

El primer paso es leer las bandas 4, 3 y 2 del archivo LAN mediante la función MATLAB® .multibandread

Los canales 4, 3 y 2 cubren el infrarrojo cercano (NIR), el rojo visible y las partes verdes visibles del espectro electromagnético. Cuando se asignan a los planos rojo, verde y azul, respectivamente, de una imagen RGB, el resultado es un compuesto de infrarrojo de color (CIR) estándar. El argumento de entrada final para especifica qué bandas leer y en qué orden, para que pueda construir un compuesto en un solo paso.multibandread

CIR = multibandread('paris.lan',[512, 512, 7],'uint8=>uint8',...                     128,'bil','ieee-le',{'Band','Direct',[4 3 2]});

Variable es una matriz de clase 512 por 512 por 3 .CIRuint8 Es una imagen RGB, pero con colores falsos. Cuando se muestra la imagen, los valores de píxel rojo significan el canal NIR, los valores verdes significan el canal rojo visible y los valores azules significan el canal verde visible.

En la imagen del CIR, las características del agua son muy oscuras (el río Sena) y la vegetación verde aparece roja (parques y árboles de sombra). Gran parte de la apariencia de la imagen se debe al hecho de que la vegetación saludable y rica en clorofila tiene una alta reflectancia en el infrarrojo cercano. Dado que el canal NIR se asigna al canal rojo de la imagen compuesta, cualquier área con una alta densidad de vegetación aparece en rojo en la pantalla. Un ejemplo notable es el área de color rojo brillante en el borde izquierdo, un gran parque (el Bois de Boulogne) situado al oeste del centro de París dentro de una curva del río Sena.

imshow(CIR) title('CIR Composite') text(size(CIR,2),size(CIR,1) + 15,...   'Image courtesy of Space Imaging, LLC',...   'FontSize',7,'HorizontalAlignment','right')

Mediante el análisis de las diferencias entre los canales NIR y rojo, puede cuantificar este contraste en el contenido espectral entre áreas vegetadas y otras superficies como pavimento, suelo desnudo, edificios o agua.

Paso 2: Construir una gráfica de dispersión espectral nIR-rojo

Un gráfico de dispersión es un lugar natural para comenzar al comparar el canal NIR (que se muestra como valores de píxelrojo) con el canal rojo visible (que se muestra como valores de píxeles verdes). Es conveniente extraer estos canales del compuesto CIR original en variables individuales. También es útil convertir de clase a clase para que se puedan utilizar las mismas variables en el cálculo NDVI a continuación, así como en la gráfica de dispersión.uint8single

NIR = im2single(CIR(:,:,1)); R = im2single(CIR(:,:,2));

Al ver los dos canales juntos como imágenes en escala de grises, puede ver lo diferentes que se ven.

imshow(R) title('Visible Red Band')

imshow(NIR) title('Near Infrared Band')

Con una simple llamada al comando en MATLAB, puede crear un gráfico de dispersión que muestre un punto por píxel (como una cruz azul, en este caso), con su coordenada x determinada por su valor en el canal rojo y su coordenada y por el valor de su valor en el canal NIR.plot

plot(R,NIR,'+b') ax = gca; ax.XLim  = [0 1]; ax.XTick = 0:0.2:1; ax.YLim  =  [0 1]; ax.YTick = 0:0.2:1; axis square xlabel('red level') ylabel('NIR level') title('NIR vs. Red Scatter Plot')

La aparición de la parcela de dispersión de la escena de París es característica de una zona urbana templada con árboles en follaje de verano. Hay un conjunto de píxeles cerca de la diagonal para el que los valores NIR y rojo son casi iguales. Este "borde gris" incluye características como superficies de carretera y muchos tejados. Por encima y a la izquierda hay otro conjunto de píxeles para el que el valor NIR a menudo está muy por encima del valor rojo. Esta zona abarca esencialmente toda la vegetación verde.

Paso 3: Calcular el índice de vegetación a través de MATLAB® Array Arithmetic

Observe desde la gráfica de dispersión que tomar la relación entre el nivel NIR y el nivel rojo sería una forma de localizar píxeles que contengan vegetación densa. Sin embargo, el resultado sería ruidoso para los píxeles oscuros con valores pequeños en ambos canales. Observe también que la diferencia entre los canales NIR y rojo debe ser mayor para una mayor densidad de clorofila. El índice de vegetación de diferencia normalizada (NDVI) está motivado por esta segunda observación. Toma la diferencia (NIR - rojo) y la normaliza para ayudar a equilibrar los efectos de la iluminación desigual, como las sombras de nubes o colinas. En otras palabras, en una base de píxel a píxel restar el valor del canal rojo del valor del canal NIR y dividir por su suma.

ndvi = (NIR - R) ./ (NIR + R);

Observe cómo los operadores aritméticos de matriz en MATLAB permiten calcular una imagen NDVI completa en un comando simple. Recuerde que las variables y tener clase .RNIRsingle Esta opción utiliza menos almacenamiento que la clase, pero a diferencia de una clase de enteros también permite que la relación resultante asuma una gradación suave de los valores.double

Variable es una matriz 2D de clase con un rango máximo teórico de [-1 1].ndvisingle Puede especificar estos límites teóricos al mostrarlos como una imagen en escala de grises.ndvi

figure imshow(ndvi,'DisplayRange',[-1 1]) title('Normalized Difference Vegetation Index')

El río Sena aparece muy oscuro en la imagen NDVI. La gran zona de luz cerca del borde izquierdo de la imagen es el parque (Bois de Boulogne) mencionado anteriormente.

Paso 4: Localizar Vegetación -- Umbral de la imagen NDVI

Para identificar los píxeles con más probabilidades de contener vegetación significativa, aplique un umbral simple a la imagen NDVI.

threshold = 0.4; q = (ndvi > threshold);

Por lo tanto, el porcentaje de píxeles seleccionados es

100 * numel(NIR(q(:))) / numel(NIR)
ans = 5.2204 

o alrededor del 5 por ciento.

El parque y otras áreas más pequeñas de vegetación aparecen blancas de forma predeterminada al mostrar la imagen lógica (binaria).q

imshow(q) title('NDVI with Threshold Applied')

Paso 5: Vincular contenido espectral y espacial

Para vincular el contenido espectral y espacial, puede localizar píxeles por encima del umbral en el gráfico de dispersión rojo NIR, volver a dibujar el gráfico de dispersión con los píxeles de umbral superior en un color de contraste (verde) y, a continuación, volver a mostrar la imagen NDVI de umbral con la misma imagen NDVI de umbral utilizando la misma imagen ndVI de umbral con la misma imagen esquema de color azul-verde. Como era de esperar, los píxeles con un valor NDVI por encima del umbral aparecen en la parte superior izquierda del resto y corresponden a los píxeles más rojos en las pantallas compuestas CIR.

Cree el gráfico de dispersión y, a continuación, muestre el NDVI umbral.

figure subplot(1,2,1) plot(R,NIR,'+b') hold on plot(R(q(:)),NIR(q(:)),'g+') axis square xlabel('red level') ylabel('NIR level') title('NIR vs. Red Scatter Plot')  subplot(1,2,2) imshow(q) colormap([0 0 1; 0 1 0]); title('NDVI with Threshold Applied')

Consulte también

| |

Ejemplos relacionados

Más acerca de