Processamento Digital de Imagens

Estatísticas sobre Imagens Digitais



    Nesta aula abordaremos os principais conceitos relacionados cálculos de estatísticas, histogramas e correlação entre imagens digitais.


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


Tópicos


Estatísticas Univariadas

        O valor médio, µi, ou valor esperado, de uma imagem digital i é calculado pela somatória dos valores de níveis de cinza, nc, de todos os n (n=nlin*ncol) pixels da imagem dividido pelo número total de pixels, n. A fórmula de cálculo do valor médio está apresentada na figura abaixo.


               A variância,  , da imagem digital i representa o valor de desvio dos níveis de cinza da imagem em relação ao nível de cinza médio. O desvio padrão de uma imagem digital pode ser calculado pela mostrada na figura abaixo:           
              



        O desvio padrão, que é a raiz quadrada da variância, informa sobre a maior ou menor homogeneidade, ou heterogeneidade, de uma imagem digital.

                A Moda de uma imagem digital é o nível de cinza mais frequente na imagem. Para se calcular a moda é necessário calcular a frequência de todos os níveis de cinza na imagem e determinar aquele de maior frequência.
                A Mediana de uma imagem digital é determinada pelo valor de nível de cinza que divide a imagem em dois grupos de tamanhos iguais. Para se calcular a mediana de uma  imagem é necessário uma ordenação dos níveis de cinza da imagem.


0 2 3 3 2 0
2 3 0 3 1 2
3 3 1 1 2 2
3 2 1 0 2 2
3 3 3 2 3 3


Up

Histograma de uma imagem digital



Figura: Histograma de uma imagem digital


digitalizacao

Figura: Histograma de uma imagem digital com média e variância baixas


digitalizacao


 
  Figura: Histograma de uma imagem digital com média e variância altas




Up

Covariância e Correlação entre imagens digitais





 
Up

Exercícios

Laboratório 3 - Cálculo de estatísticas e histograma de uma imagem digital
  1. Faça um programa em C para ler uma imagem do tipo RAW, calcular o valor médio, o desvio padrão, o histograma e a moda de uma banda de uma imagem multiespectral (por exemplo esta banda 3  da imagem de brasilia) o resultado num arquivo texto (ASCII). 
  2. Abra o arquivo texto gerado. O que você observou? O que voce pode concluir comparando os valores obtidos?
  3. Faça um relatório sobre o laboratório e envie para o professor. 
       Observação: O relatório deve ser digital e deve ser enviado para o e-mail do professor ( carlos@dpi.inpe.br ) contendo:
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. Sem ver uma imagem digital, o que voce pode concluir se alguém te apresentar apenas as estatísticas univariadas da imagem?

2. Calcule as estatísticas univariadas (média, variância, desvio padrão, mediana e moda) da imagem abaixo:
 1 5 3 6 4 6
 3 7 0 2 5 5
6 5 5 1 7 2

3. Nesta apostila foi apresentado uma forma de cálculo do desvio padrão de uma imagem digital. Você poderia sugerir outra forma para esse mesmo cálculo? Pesquise sobre isto.

4. Imagens com aparência homogênea tem desvio padrão baixo, enquanto que imagens heterogêneas possuem desvio padrão alto. Você concorda com esta afirmação? Porque?

5. Faça  manualmente, o gráfico de histograma da imagem do exercício 2.

6. Calcule o coeficiente de correlação entre a imagem do exercicio 2 e as duas imagens abaixo. Qual sua conclusão em relação ao valor obtido para esse coeficiente? Explique.
3 4 6 2 1 5
2 7 1 0 2 3
4 7 3 2 1 0

6 2 4 1 3 1
4 0 7 5 2 2
1 2 2 6 0 5


 
Up

Apêndice

Apendice:  Programa em Java que calcula algumas estatisticas de uma imagem digital em níveis de cinza codificada em 8 bits.

// Inicio do Programa

import java.io.*;   // Importa pacote java.io

public class Estatisticas {

    public void Estatisticas(){  };

    public static void main (String[] args) throws IOException { // desconsidera

        String nome_arq_ent="nemo500-270nc.raw";
        String nome_arq_res="Estatisticas.txt";

        FileInputStream arq_ent;  // objetos para arquivo binario
        FileWriter arq_res;  // objeto para arquivo texto

        int nlin=270, ncol =500;

        arq_ent = new FileInputStream(nome_arq_ent);
        arq_res = new FileWriter(nome_arq_res);

//        Calculo da Média
        double media = (double)0;

        for(int l=0; l<nlin; l++)
            for(int c=0; c<ncol; c++)
                media+= (double)arq_ent.read();

        media/=(double)(nlin*ncol);

//        Calculo da Variancia
        arq_ent.close();  // fecha o arquivo
        arq_ent = new FileInputStream(nome_arq_ent); // abre o arquivo para ler dados a partir do inicio

        double variancia = (double)0, valor;

        for(int l=0; l<nlin; l++)
            for(int c=0; c<ncol; c++){
                valor = arq_ent.read();
                variancia+= ((valor-media)*(valor-media));
            }

        variancia/=(double)(nlin*ncol);

//        Calculo da Histograma e Moda

        arq_ent.close();
        arq_ent = new FileInputStream(nome_arq_ent);

        int histo[]= new int[256];

        for(int i=0;i<256;i++) histo[i]=0;

        for(int l=0; l<nlin; l++)
            for(int c=0; c<ncol; c++)
                histo[arq_ent.read()]++;

//        Saida dos dados no Arquivo de Saida

        arq_res.write("Estatisticas do arquivo: "+nome_arq_ent);
        arq_res.write("\n\nNumero de Colunas = "+ncol);
        arq_res.write("\nNumero de Linhas = "+nlin);
        arq_res.write("\nTotal de Pixels = "+nlin*ncol);
        arq_res.write("\nValor Médio = "+media+" ~ "+Math.round(media));
        arq_res.write("\nVariancia = "+variancia);
        arq_res.write("\nDesvio Padrao = "+Math.sqrt(variancia));

        arq_res.write("\nHistograma ");
        int max = 0;
        for(int i=0;i<256;i++){
            arq_res.write("\nFreq["+i+"] = "+histo[i]);
            if(histo[i]>histo[max])max = i;
        }

        arq_res.write("\n\nValor da Moda = "+max);

        arq_res.write("\n\nFim das estatisticas");

        arq_ent.close();
        arq_res.close();

        System.out.println("\nTermino Normal");


    } // end main


}// end class