Fusão de imagens utilizando transformada Wavelet e IHS no ambiente TerraLib Disciplina: Paradigmas e Ferramentas de Desenvolvimento de Software Docentes: Dr. Gilberto Câmara Lúbia Vinhas Discentes: Paulo Honda Ota Vantier Veronezi Bagli
Estrutura Introdução - Motivação Objetivo Transformação IHS Fusão por Transformada Wavelets Padrão Adotado Resultados Conclusão
dos algoritmos portados Introdução Motivação Realizar fusão de imagens CBERS através de Transformação Wavelet e IHS no ambiente TerraLib utilizando padrões de projeto para manipulação dos algoritmos portados
Introdução Objetivos Portar algoritmo de transformação RGB IHS do aplicativo SPRING para o ambiente TerraLib Implementar algoritmos de fusão por Transformadas Wavelets no ambiente TerraLib Adotar padrões de projeto para manipulação desses algoritmos
Transformação RGB IHS Para descrever as propriedades de cor de um objeto em uma imagem, normalmente o olho humano não distingue a proporção de azul, verde e vermelho presentes, e sim, avalia a intensidade (I), a cor ou matiz (H) e a saturação (S).
Transformação RGB IHS Fusão
Fusão por Transformada Wavelet A fusão de imagens através da transformada wavelet, em geral, é realizada pela troca da sub-banda de baixa resolução em um determinado nível j, que é resultado da decomposição de uma imagem pancromática de alta resolução espacial, por uma imagem de baixa resolução que contém a informação espectral.
Fusão por Wavelet (método Ventura)
Padrão Adotado Strategy Criar uma camada que encapsule os diversos algoritmos de fusão de forma que possam ser alterados, inseridos ou removidos independentemente dos clientes que os utilizam.
Padrão Adotado Problema: Os métodos de fusão por wavelet e transformação IHS possuem comportamentos diferentes. Fusão por wavelets: entrada: Banda PAN + Banda Multiespectral + Filtro + Nível de decomposição + nome de saída saída: 1 Banda da Imagem Fundida Fusão por Transformação IHS: entrada: Banda PAN + 3 Bandas Multiespectrais + flag + nome de saída saída: 3 Bandas da Imagem Fundida Transformação de cores: entrada: 3 Bandas Multiespectrais + flag + nome de saída saída: 3 Bandas da Imagem Transformada (RGB/IHS)
Padrão Adotado Solução: Criar classe Imagem Multiespectral (TeImaMult), para uniformizar os parâmetros de entrada das imagens multiespectrais nos algoritmos de fusão por Wavelet e transformação de cores. Uniformizar os outros parâmetros de entrada (flag, nível de decomposição, nome da imagem de saída e filtro) Delegar a instanciação da estratégia escolhida por FACTORY.
Estratégia para fusão / transformação de cor _estrategiaFusao/Trans Fusao Estrategia AppFusao() MetodoFusao() _estrategiaFusao/Trans->MetodoFusao() Wavelet Transformação MetodoFusao() MetodoFusao() Ventura Garguet Método n RGB2IHS IHS2RGB Método n MetodoFusao() MetodoFusao() MetodoFusao() MetodoFusao() MetodoFusao() MetodoFusao()
// Estratégia de Wavelet class Strat_Fusao_Wave: public Strat_Fusao { public: Strat_Fusao_Wave(int l,char* f):filtro(f),level(l){}; virtual void MetodoFusao(TeImaMult& ImageMult, char* name_exit, TeRaster& ImagePan ) = 0; char *filtro, *name_out; int level; string name, type; }; class Ventura: public Strat_Fusao_Wave { Ventura(int l,char* f):Strat_Fusao_Wave(l,f){} void MetodoFusao( TeImaMult& ImageMult, char* name_exit, TeRaster& ImagePan ){ for (int i = 0 ; i < ImageMult.getsize() ; i++){ name = TeGetName ( name_exit); type = TeGetExtension (name_exit); string temp = name+"_"+Te2String(i)+"."+type; name_out = (char*)temp.c_str(); fusionVentura(ImagePan, ImageMult.getband(i), filtro, level, name_out); } class Garguet: public Strat_Fusao_Wave{ Garguet(int l,char* f):Strat_Fusao_Wave(l,f){}; void MetodoFusao( TeImaMult& ImageMult, char* name_exit, TeRaster& ImagePan ) { fusionGarguet(ImagePan, ImageMult.getband(i), filtro, level, name_out);
// Estratégia de Transformação class Strat_Fusao_Transf: public Strat_Fusao { public: Strat_Fusao_Transf(int f):flag(f){} virtual void MetodoFusao( TeImaMult& ImageMult, char* name_exit, TeRaster& ImagePan ) = 0; int flag; }; class RGB2IHS: public Strat_Fusao_Transf RGB2IHS(int f):Strat_Fusao_Transf(f){}; void MetodoFusao( TeImaMult& ImageMult, char* name_exit, TeRaster& ImagePan ) ihs_RGB2IHS(ImageMult.getband(0), ImageMult.getband(1) , ImageMult.getband(2), flag, name_exit, ImagePan); } class IHS2RGB: public Strat_Fusao_Transf IHS2RGB(int f):Strat_Fusao_Transf(f){}; ihs_IHS2RGB(ImageMult.getband(0), ImageMult.getband(1) , ImageMult.getband(2), flag, name_exit, ImagePan);
// Factory da estratégia de processamento class Strat_Factory { public: static Strat_Fusao* make(const string &method,int n = 0, char* f = 0) if ( method == "Ventura" ) return ( new Ventura(n,f) ); else if ( method == "Garguet" ) return ( new Garguet(n,f) ); else if ( method == "RGB2IHS" || method == "FusionTrans" ) return ( new RGB2IHS(n) ); else if ( method == "IHS2RGB" ) return ( new IHS2RGB(n) ); } }; class Fusao Strat_Fusao* proc; Fusao(Strat_Fusao* st):proc(st){} void AppFusao( TeImaMult& ImageMult, char* name_exit, TeRaster& ImagePan = TeRaster() ) proc->MetodoFusao (ImageMult, name_exit, ImagePan);
Exemplo de aplicação CBERS_B2 CBERS_B3 CBERS_B4
spot5_pan
Composição CBERS RGB(342)
Resultado Wavelet (Ventura) 4 níveis de decomposição TeImaMult ima3( imab3, imab4 , imab2 ); // classe que suporta n bandas Strat_Fusao* strat = Strat_Factory::make("Ventura", level, filtro); Fusao fusao( strat ); fusao.AppFusao(ima3, nomesaida, imapan);
Resultado (Garguet - Duport) 4 níveis de decomposição TeImaMult ima3( imab3, imab4 , imab2 ); // classe que suporta n bandas Strat_Fusao* strat = Strat_Factory::make(“Garguet", level, filtro); Fusao fusao( strat ); fusao.AppFusao(ima3, nomesaida, imapan);
Resultado Fusão por Transformação IHS TeImaMult ima3( imab3, imab4 , imab2 ); // classe que suporta n bandas Strat_Fusao* strat = Strat_Factory::make(“FusionTrans"); Fusao fusao( strat ); fusao.AppFusao(ima3, nomesaida, imapan);
Transformação RGB IHS TeImaMult ima3( imab3, imab4 , imab2 ); // classe que suporta n bandas Strat_Fusao* strat = Strat_Factory::make(“RGB2IHS", flag); Fusao fusao( strat ); fusao.AppFusao(ima3, nomesaida); IHS2RGB
Conclusões A utilização de padrões de projeto se mostrou muito eficiente, pois pode-se tratar diferentes algoritmos de mesma forma A implementação da abstração de imagem multiespectral (classe TeImaMult) se mostrou necessária e eficiente para a uniformização dos métodos utilizados
Agradecimentos Lúbia Vinhas Ricardo Cartaxo M. Souza (DPI - equipe TerraLib) Ricardo Cartaxo M. Souza (DPI) Leonardo Santanna Bins