Processamento Digital de Imagens

Filtragens Espaciais



    Nesta aula abordaremos os principais conceitos relacionados à aplicação de filtros espaciais, em imagens digitais, e suas aplicaçoes

Importante: O resumo abaixo deve ser complementado, pelo aluno, com a leitura dos textos sugeridos na bibliografia do curso.


Tópicos


Introdução - Conceitos iniciais






Figura: Ilustração do conceito de operações de vizinhança aplicadas em imagens digitais.



X


X X
X
X
X
X
X X
X

X

X X X
 
(a)                                                    (b)

Figura: Vizinhanças (a) 4 e (b) 8 em uma imagem digital.




Figura: Ilustração do procedimento de convolução de uma máscara de pesos sobre uma imagem digital (figura adaptada de: http://www.dpi.inpe.br/cursos/pdi/pdi5-realce_arquivos/frame.htm )

                                           p[i,j] = a*p[i-1,j-1]  + b*p[i-1, j ]  +  c*p[i-1,j+1] +
                                                      d*p[  i  ,j-1]  + e*p[  i  , j ]  +  f*p[  i ,j+1] +
                                                      g*p[i+1,j-1]  + h*p[i+1, j ]  +  i*p[i+1,j+1]                                              p[1,1] = a*p[0,0] + b*p[0,1] + c*p[0,2] +
                                                           d*p[1,0] + e*p[1,1] + f*p[1,2] +
                                                            g*p[2,0] + h*p[2,1] + i*p[2,2]

Up

Filtros Passa-Baixas

                          
1
1 1

  ÷9 
1
1
0

    ÷4  
1 1 1

  ÷10
1 1 1 1 0 1
1
1
1 1 1 0
1 0 1 1 1


1/9
1/9 1/9
1/9 1/9
1/9
1/9 1/9 1/9
                         
120
120
120
120
120
                
      »           
120
120
120
120
120
120
210
120
30
120
120
130
120
110
120
120
120
120
120
120
120
120
120
120
120
X
Z


    • Resultado: A imagem fica mais suavizada, mais homogênea com eliminação de ruídos, caso existam.  Perde-se nitidez e contraste, mas ganha-se homogeneidade dos elementos da imagem.


(a)

(b)

(c)

Figura: Filtro Passa-Baixas aplicado à imagem digital apresentada em (a). Em (b) apresenta-se o resultado da aplicação do filtro com máscara 3x3 e em (c) com máscara 5x5

    • Importante: Neste exemplo utilizamos uma janela 3x3, porém é comum utilizar-se máscaras com janelas 5x5, 7x7, etc.., caso seja necessário considerar-se vizinhanças maiores no processo de convolução.
    • Você seria capaz  de redefinir as janelas apresentadas para máscaras com janelas 5x5? Mostre-as.
    • Sugestão: Fazer exercícios de filtros passa-baixas no SPRING e no IrfanView

Up

Filtros não lineares para remoção de ruídos


120
100
100
100
80
                
      »           
100
100
120
100
80
95
255
120
0
80
95
120
100
80
80
120
110
80
100
80
110
120
110
100
90
X
Z

    • Importante: O filtro da moda garante que o conjunto de valores digitais da imagem de saída é um subconjunto do domínio de valores da imagem de entrada. Assim, não são criados níveis digitais diferentes daqueles presentes na imagem de entrada.

100
100
120
100
80
                
      »           
100
100
120
100
80
95
255
120
0
115
95
110
110
110
115
110
120
110
110
80
110
120
110
100
80
X
Z




(a)

(b)

(c)

Figura: Filtros com vizinhança 3x3 de Média (b) e de Mediana (c) aplicados sobre uma imagem com ruído (a)




Up

Filtros Passa-Altas e Detectores de Bordas

                          
-1
-1
-1

0
-1
0
1
-2
1
-1
8
-1
-1 4
-1
-2
4
-2
-1
-1
-1
0
-1 0 1
-2
1



-1
-1
-1
-1
8
-1
-1
-1
-1
                         

10
10
10
10
10
                
      »           
10
10
10
10
10
10
0
10
20
10
10
-80
0
80
10
10
10
10
10
10
10
10
10
10
10
X
Z



         Importante: Neste exemplo utilizamos uma máscara com janela 3x3, porém é comum utilizar-se janelas 5x5, 7x7, etc... caso se queira considerar vizinhanças maiores.

                         
-1
-1
-1
     
-1
2
-1
2
2
2
-1 2
-1
-1
-1
-1
-1
2
-1
(a)
(b)

                         
-1
-1
2
      
2
-1
-1
-1
2
-1
-1 2
-1
2
-1
-1
-1
-1 2
(c)
(d)

Figura: Janelas para (a) detecão de linhas horizontais, (b) detecção de linhas verticais, (c) e (d) detecção de linhas diagonais


                         
Operador de Roberts
0
0
-1
     
-1
0
0
0
1
0
0 1
0
0
0
0
0
0
0
da = p[i,j]-p[i-1,j+1]
db = p[i,j]-p[i-1,j-1]
S = ((da)2+(db])2)1/2

                         
Operador de Sobel
1
0
-1
      
1
2
1
2
0
-2
0
0
0
1
0
-1
-1
-2
-1
dx = ((p[i-1,j-1]+2.0*p[i,j-11]+p[i+1,j-11])/4.0 -
(p[i-1,j+1]+2.0*p[i,j+1]+p[i+1,j+1])/4. )/2.0
dy = ((p[i-1,j-1]+2.0*p[i-1,j]+p[i-1,j+1])/4.0 -
(p[i+1,j-1]+2.0*p[i+1,j]+p[i+1,j+1]/4. )/2.0
S= ((dx)2+(dy)2)1/2



(a)

(b)

(c)

(d)

Figura: Filtro Passa-Altas aplicado à imagem digital apresentada em (a). Em (b) apresenta-se o resultado da aplicação do filtro passa-altas com mácara de janela 3x3, em (b) o operador de Roberts e em (c) o operador de Sobel



(a)

(b)

(c)

Figura: Filtros detectores de bordas: (a) imagem colorida original, (b) Filtro de Roberts e  (c) Filtro de Sobel





(a)

(b)

(c)

Figura: Filtros detectores de bordas: (a) imagem colorida original, (b) Filtro de Sobel e  (c) Imagem Original + Filtro de Sobel




Up

Exercícios

Laboratório - Filtragem passa-baixas em uma imagem digital.


       Observação: O relatório deve ser digital e deve conter:
Identificação do aluno ( nome, nro de matrícula, outros...) e data.
Nome do experimento do laboratório.
Uma introdução explicitando o objetivo do trabalho do laboratório.
Uma descrição da  metodologia utilizada para resolver o problema.
Uma descrição dos resultados obtidos com análises pertinentes.
Uma seção de conclusão com opiniões próprias de cada aluno e sugestões gerais relacionadas com o experimento.

 
Laboratório - Filtragem passa-altas detector de bordas em uma imagem digital.

       Observação: O relatório deve ser digital e deve ser conter:
Identificação do aluno ( nome, nro de matrícula, outros...) e data.
Nome do experimento do laboratório.
Uma introdução explicitando o objetivo do trabalho do laboratório.
Uma descrição da  metodologia utilizada para resolver o problema.
Uma descrição dos resultados obtidos com análises pertinentes.
Uma seção de conclusão com opiniões próprias de cada aluno e sugestões gerais relacionadas com o experimento.

 


Exercícios gerais

1. Faça operações utilizando o SPRING (Ative um Plano de Informação da categoria Imagem. Ative a função de operações aritméticas no menu Imagem do SPRING).  Utilize essa função  para executar operações aritméticas sobre duas bandas presentes no seu banco de dados. Aplique operações de  realce por contraste na banda de saída, quando necessário.

3. Aplique um filtro de média 5x5 na imagem X abaixo, mostrando o resultado da imagem de saída Z após a aplicação do filtro. Qual sua conclusão ao comparar a imagem X com a imagem Z?

                                                        15  18  13  16  20          
                                                X =  30  37  40  32  28   
                                                        16  10  15  18  14
                                                        70  77  66  55  60
       
4. Apresentou-se algumas máscaras para implementação de filtros lineares de média. Um filtro que substitui o filtro de média, com algumas vantagens, é o filtro de mediana. Pesquise para saber como seria a implementação do filtro de mediana e qual sua vantagem em relação ao filtro de média.
                          
5. Aplique um filtro passa-altas 3x3 na imagem X abaixo, mostrando o resultado da imagem de saída Z após a aplicação do filtro. Qual sua conclusão ao comparar a imagem X com a imagem Z?

                                                        15  18  13  16  20          
                                                X =  30  37  40  32  28   
                                                        16  10  15  18  14
                                                        70  77  66  55  60
       
6. Faça o mapeamento dos valores da imagem Z do exercício anterior para níveis digitais de 0 a 255

7. Explique como você faria para aplicar filtros espaciais em imagens coloridas, cada qual com a s suas 3 componentes R, G e B.

 
Up

Apêndice: Estrutura básica de um Programa em Java para filtro de Mediana

//   Uso de ImageIO com BufferedImage
//     Vantagens: ve varios tipos de imagens,
//   Dá acesso aos elementos de uma imagem e visualiza dado processado

import java.io.File;

// pacotes do AWT
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;


// pacote Swing para definir interface gráfica
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.ImageIcon;

// leitura em modo imediato - para J2SE 1.4+
import javax.imageio.ImageIO;

public class FiltroMediana extends JFrame {

  public static void main(String args[]) {

    // Mostra JFrame decorado pelo Swing
        JFrame.setDefaultLookAndFeelDecorated(true);

    // Carrega e Visualiza imagem original

        String ima_name_in = "Comp453ruido.jpg";
        String ima_name_out = "Comp453Proc.jpg";

//        String ima_name_in = "ccd1.gif";
//        String ima_name_out = "Saida.gif";

        BufferedImage ima_in = CarregaImagem(ima_name_in);

           FiltroMediana frame1 = new FiltroMediana();

         frame1.MostraImagem(ima_in, ima_name_in);

    // Carrega e processa imagem original e mostra imagem processada

         BufferedImage ima_out = ProcessaImagem(ima_in);

         FiltroMediana frame2 = new FiltroMediana();

        frame2.MostraImagem(ima_out, ima_name_out);

         SalvaImagem(ima_out, ima_name_out);
      }

// Método para carregar uma imagem do disco para um objeto da classe BufferedIma

      public static BufferedImage CarregaImagem(String image_name)   {
    // Associa objeto BufferedImage com <arquivo_imagem>
        BufferedImage ima_in = null;

    // Carrega imagem

        File file = new File(image_name);
        try {
          ima_in= ImageIO.read(file);
        } catch(Exception e) {
              System.out.println("Imagem '" + image_name + "' nao existe.");
              System.exit(0);
        }

        System.out.println("Nome da Imagem: "+image_name+" Tipo da Imagem: "+ima_in.getType());
        System.out.println("Tamanho da Imagem: Colunas "+ima_in.getWidth()+" Linhas "+ima_in.getHeight());


        return ima_in;

    }

// Método para Salvar uma imagem no formato JPEG
    public static void SalvaImagem(BufferedImage dest, String image_name) {

        try {

            ImageIO.write(dest, "jpg", new File(image_name));

        } catch (Exception e) {

            System.out.println("Problema gravando arquivo. ");
            System.exit(0);
        }
    }

// Método para Processar uma Imagem

    public static BufferedImage ProcessaImagem (BufferedImage ima_in) {

    // Cria imagem de saida com mesmo tamanho e tipo da imagem de entrada

        BufferedImage ima_out  = new BufferedImage(ima_in.getWidth(),ima_in.getHeight(),ima_in.getType());

    // Recupera matriz das imagens de entrada e saida

        Raster raster = ima_in.getRaster(); // declara e instancia objeto raster soh para leitura
        WritableRaster wraster = ima_out.getRaster(); // declara e instancia objeto raster para escrita

    // Processa valores da imagem de entrada e armazena na imagem de saida

        double valornr, valorng, valornb;
        int[] v = new int[9];

        for(int y=1; y<ima_in.getHeight()-1; y++)
            for(int x=1; x<ima_in.getWidth()-1; x++){

//            Aplica Filtro de Mediana 3x3

                LeJanela3x3(raster,v,x,y,0);
                valornr = CalcMediana(9,v);

                LeJanela3x3(raster,v,x,y,1);
                valorng = CalcMediana(9,v);

                LeJanela3x3(raster,v,x,y,2);
                valornb = CalcMediana(9,v);

                wraster.setSample(x,y,0,(int)(valornr+.5));
                wraster.setSample(x,y,1,(int)(valorng+.5));
                wraster.setSample(x,y,2,(int)(valornb+.5));

            }

        return ima_out;
    };



//    Método para mostrar uma imagem em um frame

    public void MostraImagem(BufferedImage ima, String image_name) {

    // Define GUI com objetos do Swing
           JLabel lsrc2 = new JLabel(new ImageIcon(ima));
        getContentPane().add(new JScrollPane(lsrc2));

    // Atribui nome e tamanho ao frame
           setTitle("Java2DImageDisplay: =>" + image_name);
          setSize(ima.getWidth()+40, ima.getHeight()+40);
        setVisible(true);

    // Encerra a aplicação clicando no "close"
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


  }


  // Método para Ler uma janela 3x3 de uma banda de uma imagem de entrada num vetor v.
  // (x,y) representa a coluna e a linha central da janela

    public static void LeJanela3x3(Raster raster, int []v, int x, int y, int banda){


                v[0] = raster.getSample(x-1,y-1,banda);
                v[1] = raster.getSample(x  ,y-1,banda);
                v[2] = raster.getSample(x+1,y-1,banda);
                v[3] = raster.getSample(x-1,y  ,banda);
                v[4] = raster.getSample(x  ,y  ,banda);
                v[5] = raster.getSample(x+1,y  ,banda);
                v[6] = raster.getSample(x-1,y+1,banda);
                v[7] = raster.getSample(x  ,y+1,banda);
                v[8] = raster.getSample(x+1,y+1,banda);

                return;
    }


// Método para Cálculo da Mediana de um vetor de npts pontos

  public static double CalcMediana(int npts, int []v){

    int aux;

// Ordena em ordem crescente os elementos do vetor

      for(int i=0; i<npts-1; i++)
          for(int j=i+1; j<npts; j++)
            if(v[i] > v[j]){
                    aux = v[i]; v[i]=v[j]; v[j]=aux;
            }

// Define o valor da mediana
      if((npts%2)==0)
          return((double)v[npts/2]);
      else
            return((double)((v[npts/2]+v[npts/2+1])/2.));
  }


} // fim da classe FiltroMediana