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.

Encuentra vegetación en una imagen multiespectral

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

Las diferencias de datos de imagen se pueden utilizar para distinguir las diferentes características de la superficie de una imagen, que tienen una reflectividad variable en diferentes canales espectrales. Al encontrar diferencias entre los canales rojo y NIR visibles, el ejemplo identifica áreas que contienen vegetación significativa.

Paso 1: importar colores-canales infrarrojos de un archivo de imagen multiespectral

Este ejemplo encuentra vegetación en una imagen de Mapeador temático de 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 ERDAS LAN. El archivo LAN,, contiene una imagen de 7 canales 512-por-512 Landsat.paris.lan Un encabezado de 128 bytes es seguido por los valores de píxel, que son banda intercalada por línea (BIL) en orden de número de banda creciente. 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 utilizando 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 infrarrojos de color estándar (CIR). El argumento de entrada final para especificar 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-by-512-by-3.CIRuint8 Es una imagen RGB, pero con colores falsos. Cuando se visualiza la imagen, los valores de píxel rojos 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 sana, rica en clorofila tiene una alta reflectancia en el infrarrojo cercano. Debido a que el canal NIR se asigna al canal rojo en la imagen compuesta, cualquier área con una densidad de vegetación alta aparece roja 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')

Al analizar las diferencias entre el NIR y los canales rojos, puede cuantificar este contraste en el contenido espectral entre áreas vegetadas y otras superficies como pavimento, suelo desnudo, edificios o agua.

Paso 2: construye una gráfica de dispersión espectral NIR-red

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

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

Viendo los dos canales juntos como imágenes en escala de grises, se puede ver lo diferente 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 apariencia de la trama de dispersión de la escena de París es característico de una zona urbana templada con árboles en el follaje de verano. Hay un conjunto de píxeles cerca de la diagonal para los que los valores NIR y rojo son casi iguales. Este "borde gris" incluye características como las superficies de las carreteras y muchos tejados. Arriba y a la izquierda hay otro conjunto de pixeles para los cuales el valor NIR es a menudo 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® aritmética de matrices

Observe desde el gráfico de dispersión que tomar la relación del nivel NIR al nivel rojo sería una forma de ubicar los 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-red) y la normaliza para ayudar a equilibrar los efectos de la iluminación irregular, como las sombras de las nubes o las colinas. En otras palabras, píxel por píxel resta el valor del canal rojo del valor del canal NIR y lo divide por su suma.

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

Observe cómo los operadores aritméticos de matriz en MATLAB hacen posible calcular una imagen completa de NDVI en un comando simple. Recuerde que las variables y tienen 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 valores.double

Variable es una matriz 2-D de clase con un rango máximo teórico de [-1 1].ndvisingle Puede especificar estos límites teóricos al visualizarlos 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 de NDVI. La gran área de luz cerca del borde izquierdo de la imagen es el parque (Bois de Boulogne) señalado anteriormente.

Paso 4: localizar vegetación--umbral de la imagen NDVI

Para identificar los píxeles que tienen 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 se

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 la 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 ubicar píxeles por encima del umbral en el gráfico de dispersión NIR-red, volver a dibujar el gráfico de dispersión con los píxeles del umbral superior en un color de contraste (verde) y, a continuación, volver a mostrar la imagen de umbral de NDVI utilizando el mismo esquema de color azul-verde. Como se esperaba, los píxeles que tienen 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, visualice el NDVI de 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