Manejo de imagenes satelitales con Python

t 2014 ºººººººººººººººº Tratamiento Digital de Imágenes Facultad de Ingeniería – U.N.R.C. Alumno: Toledo Matias DNI

Views 139 Downloads 61 File size 736KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

t

2014

ºººººººººººººººº

Tratamiento Digital de Imágenes Facultad de Ingeniería – U.N.R.C.

Alumno: Toledo Matias

DNI:31925008

TDI 2014

Facultad de Ingeniería U.N.R.C

Introducción El siguiente trabajo se realizó como exámen prefinal de la cátedra de Tratamiento Digital de Imágenes. El objetivo del mismo es realizar en lenguaje Python un código que reciba una imágen satelital multiespectral desde un archivo de texto, separe las distintas bandas espectrales y permita realizar combinaciones de capas para armar imágenes RGB. Además, deben mostrarse y almacenarse en formato de fotografía (.png ó .jpg). La imagen satelital multiespectral proviene del satélite Terra, el cual tiene a bordo un instrumento de imagen de alta complejidad llamado Aster. Este dispositivo contiene distintos sensores, los cuales son los encargados de captar energía en distintas zonas del espectro electromagnético(bandas).

TDI 2014

Facultad de Ingeniería U.N.R.C

Desarrollo Para comenzar hay que decir que en la actualidad las imágenes satelitales son cada vez más utilizadas y requeridas por diferentes areas de la ciencia que se muestran interesadas en aprovechar esta valiosísima información. Cada sensor es responsable de una banda. Esto significa que cada sensor capta energía reflejada de distintas porciones del espetro eletromagnético. Cada capa o banda aporta distinto tipo de información, que combinadas en una imagen RGB pueden utilizarse para darle falso color a la imagen satelital, permitiendo al usuario apreciar distintos detalles. Cabe aclarar que las imagenes captadas por cada sensor son imágenes en escala de grises. En lo que respecta a la programación del script, el primer paso fue interiorizarme en como trabajaba este dispositivo de imagen ASTER, para saber cuantas bandas espectrales estaban representadas en el archivo de texto. A continuación un resumen de las características del mismo: ASTER Consiste de tres subsistemas ópticos separados, con alta resolución espectral y espacial.Los radiómetros miden en el visible e infrarrojo cercano (VNIR), en el infrarrojo de onda corta (SWIR) y en el rango infrarrojo térmico (TIR). El subsistema VNIR realiza observaciones con un telescopio en posición nadir, en las porciones del verde (banda 1) y rojo (banda 2) del espectro visible y en el infrarrojo de onda corta (banda 3N), con una resolución espacial de 15m. Además tiene otro telescopio que realiza vistas hacia atrás (banda 3B) lo que permite la visión estereoscópica en el sentido de la órbita y la generación de modelos digitales de elevaciones (MDE). El subsistema SWIR tiene 6 bandas y el tamaño del píxel es de 30m. El subsistema TIR tiene 5 bandas en el rango térmico y 90m de resolución espacial.(ver anexo)

Estructura del código El archivo principal prefinal.py simplemente se encarga de importar el módulo funciones.py y de interactuar con el usuario para que éste decida si quiere visualizar una banda individual o si quiere combinar 3 bandas para formar una imagen RGB que será almacenada como un archivo PNG. El archivo funciones.py importa todos los módulos necesarios y contiene las funciones desarrolladas para la realización del trabajo. En la primera parte del archivo se importan los distintos módulos y se importa el archivo “Imagen.txt” como un objeto, el cual luego es leído y dividido en las distintas capas. Cada

TDI 2014

Facultad de Ingeniería U.N.R.C

capa tiene un total de 864 líneas y el archivo tiene un total de 14 capas. Cabe aclarar que se trabajo solo con 8 porque parte del archivo estaba corrupto. A continuación daré una breve explicación de las funciones que fueron desarrolladas en el trabajo: Funcion eliband: Se encarga de pedir al usuario el numero de banda individual que desea visualizar. Retorna una variable en formato de string con el nombre de la banda que el usuario escogió. Función bda2matriz(bda): Se encarga de formar la matriz correspondiente a cada banda espectral y convertirla a un formato numérico para que pueda ser representada posteriormente como una imagen. Recibe como argumento de entrada la banda que se desea convertir en matriz y retorna como argumento de salida una matriz numérica de 864 filas y 1380 columnas. Función bdaimagen(I): Se encarga de mostrar la imagen correspondiente a determinada banda espectral. Recibe como argumento de entrada una matriz numérica. Funcion RGB: Se encarga de pedir al usuario que ingrese en forma de tupla los números ordenados de las 3 bandas que desea combinar para formar una imagen RGB. Forma una matriz tridimensional con las 3 bandas que el usuario escoge y convierte todos sus valores en enteros de 8 bits(uint8), ya que el método importado fromarray que utiliza esta función lo requiere asi. Finalmente almacena esta matriz en un archivo con formato PNG que guarda en el mismo directorio que se encuentra el script principal ejecutado.

TDI 2014

Facultad de Ingeniería U.N.R.C

Resultados del script Imagen correspondiente a la banda 1

Imagen RGB correspondiente a las bandas (5,3,1)

TDI 2014

Facultad de Ingeniería U.N.R.C

Mejoras a las imagenes resultantes: Imagen RGB correspondiente a las bandas (5,3,1) con aumento brillo Para darle más brillo a la imagen se sumo un valor a cada elemento de la matriz de forma de no superar el valor 255 que es el máximo. De esta manera cada pixel tiene la misma cantidad de intensidad adicional y conserva el ancho del histograma, aunque lo desplaza hacia la derecha(hacia los blancos). Se observa que esto no aporta a la claridad de la imagen.

Imagen RGB correspondiente a las bandas (5,3,1) con aumento de brillo y de contraste: En este caso se procedió a multiplicar cada elemento de la matriz por una constante(en este caso 2) de forma de no saturar la imagen. Se observa que debido a que la intensidad de los pixeles tambien aumenta, lo hace también el brillo. Pero la mayor claridad resultante en la imagen se debe al aumento del contraste. La multiplicación hace que el histograma además de desplazarse hacia la derecha aumenta en anchura. Esto significa que hay más diferencia ahora entre los pixeles con menor intensidad y los de mayor intensidad.

TDI 2014

Facultad de Ingeniería U.N.R.C

TDI 2014

Facultad de Ingeniería U.N.R.C

Conclusión Con la realización del trabajo se repasaron y fijaron conceptos estudiados en la materia, pudiéndoselos aplicar en una actividad práctica que es de mucha utilidad en el campo del procesamiento de imagenes satelitales. Además me interioricé en un lenguaje de programación potente y muy utilizado en la actualidad como lo es Python. Algunas propuestas de mejoras al trabajo realizado serían: optimizar el código, incorporar a las funciones realizadas las opciones de mejoras de la imagen como la de aumento de brillo y contraste,entre otras.También se podrían realizar estas mejoras independientemente en cada una de las componentes de las matrices tridimensionales RGB, asi como tambien elaborar histogramas para comparar las imaganes antes y despues del procesamiento.

TDI 2014

Facultad de Ingeniería U.N.R.C

Anexos Archivo “prefinal.py” #! /usr/bin/python from funciones import *

def main(): opcion=input ("Ingrese 1 para una sola banda y 2 para combinacion RGB: ") if opcion !=1 and opcion !=2: print 'opcion no valida' main() if opcion==1: bdaimagen(bda2matriz(eliband())) if opcion==2: RGB()

if __name__ == "__main__": main()

Archivo “funciones.py” #! /usr/bin/python from PIL import Image import pylab as plt import numpy as np import sys f=open('Imagen.txt','r')

TDI 2014

Facultad de Ingeniería U.N.R.C

#####################Lectura del archivo######################## archivo=f.read()# lee el archivo completo f.close() lineas=archivo.split('\n')#obtengo una lista con las lineas del archivo paso=864 bda1=lineas[0:paso] bda2=lineas[paso+1:paso*2 +1] bda3=lineas[paso*2 +2:paso*3 +2] bda4=lineas[paso*3 +3:paso*4 +3] bda5=lineas[paso*4 +4:paso*5 +4] bda6=lineas[paso*5 +5:paso*6 +5] bda7=lineas[paso*6 +6:paso*7 +6] bda8=lineas[paso*7 +7:paso*8 +7]

##############SELECCIONA QUE BANDA MOSTRAR########################## def eliband(): valor = input ("Ingrese banda a visualizar(de 1 a 8): ") banda=[] bandas=[bda1,bda2,bda3,bda4,bda5,bda6,bda7,bda8]# for i in range(1,15): if valor==i: banda=bandas[i-1]

TDI 2014

Facultad de Ingeniería U.N.R.C

if banda==[]: print "coloque un valor entre 1 y 14" a=eliband() return a return banda

###############RECORTA EL ARCHIVO ORIGINAL Y LO CONVIERTE EN MATRIZ SEGUN LA BANDA SELECCIONADA################### def bda2matriz(bda): matbda=[] for i in bda: linfloat = [float(j) for j in i.split()] #convierte a num la matriz ya que al leer del archivo los elementos son del tipo string matbda.append(linfloat) return matbda

##############MUESTRA LA IMAGEN CORRESPONDIENTE A LA BANDA SELECCIONADA################# def bdaimagen(I): plt.imshow(I) plt.gray() plt.show()

TDI 2014

Facultad de Ingeniería U.N.R.C

###########COMBINA 3 CAPAS PARA ARMAR IMAGEN RGB Y GUARDA EN FORMATO PNG############################## def RGB(): valor = input ("Ingrese 3 bandas para armar imagen RGB, ej:(1,2,3): ") bandas=[bda1,bda2,bda3,bda4,bda5,bda6,bda7,bda8] rgbArray = np.empty((864,1380,3), 'uint8') rgbArray[..., 0] = bda2matriz(bandas[valor[0]-1]) rgbArray[..., 1] = bda2matriz(bandas[valor[1]-1]) rgbArray[..., 2] = bda2matriz(bandas[valor[2]-1]) img = Image.fromarray(rgbArray) img.save('RGB.png') Características de ASTER