PUCRS
Faculdade de Informática
LAPRO I (EC)


Trabalho Final

Objetivo


O objetivo deste trabalho é desenvolver um programa capaz de ler, tratar e gravar uma imagem.


Descrição


Você deverá ler uma imagem de um arquivo no formato binário (.DAT) descrito abaixo, tratá-la(veja a descrição dos possíveis tratamentos) e gravá-la novamente no mesmo formato.

No contexto deste trabalho, uma imagem é formada por pontos, nos quais a cor é dada por 3 valores inteiros de 1 byte. Estes valores correspondem aos valres de RED, GREEN e BLUE que formam a cor do ponto.

Para armazenar um inteiro de 1 byte declare variáveis do tipo 
unsigned char.

Os pontos da imagem devem ser armazenados em uma matriz como:

unsigned char Imagem[1000][1000][3].

Nesta matriz, os 2 primeiros índices são as posições Y e X dos pontos, respectivamente.
Dado um ponto de coordenadas (cx,cy), a sua cor é definida  pelos seguintes dados:

Imagem[cy][cx][0]  <<< componente R da cor

Imagem[cy][cx][1]  
<<< componente G da cor
Imagem[cx][cy][3] 
<<< componente B da cor

Se  você desejar, por exemplo, imprimir na tela os valores de R,G e B de todos pontos  de uma imagem, separados por linha, pode fazer conforme o código abaixo. Considere que TAMX e TAMY armazenam as dimensões da imagem.

for(y=0;y< TAMY;y++)
{
    printf("Linha %d: \n", y);
    for(x=0; x<TAMX; x++)
    {
        int r,g,b;
        r = Imagem[y][x][0];
       
g = Imagem[y][x][1];
        b = Imagem[y][x][2];
        printf("(%d, %d, %d", r,g,b);
    }
    printf("\n");
}


Formato de Imagens


Os arquivos DAT são arquivos binarios que armazenam as imagens seguem o seguinte formato.

TAMX Número do tipo int que define o número de colunas de uma imagem
TAMY Número do tipo int que define o número de linhas de uma imagem
R Número inteiro do tipo unsigned char que define o valor de RED do primeiro ponto, da primeira linha, da imagem 
G Número inteiro do tipo unsigned char que define o valor de GREEN do primeiro ponto, da primeira linha, da imagem 
B Número inteiro do tipo unsigned char que define o valor de BLUE do primeiro ponto, da primeira linha, da imagem
R Número inteiro do tipo unsigned char que define o valor de RED do segundo ponto, da primeira linha, da imagem
G Número inteiro do tipo unsigned char que define o valor de GREE do segundo ponto, da primeira linha, da imagem
B Número inteiro do tipo unsigned char que define o valor de BLUE do segundo ponto, da primeira linha, da imagem
...... ....
....... .....
R Número inteiro do tipo unsigned char que define o valor de RED do ÚLTIMO ponto, da primeira linha, da imagem
G Número inteiro do tipo unsigned char que define o valor de GREE do ÚLTIMO ponto, da primeira linha, da imagem
B Número inteiro do tipo unsigned char que define o valor de BLUE do ÚLTIMO ponto, da primeira linha, da imagem
R Número inteiro do tipo unsigned char que define o valor de RED do primeiro ponto, da SEGUNDA linha, da imagem 
G Número inteiro do tipo unsigned char que define o valor de GREEN do primeiro ponto, da SEGUNDA linha, da imagem 
B Número inteiro do tipo unsigned char que define o valor de BLUE do primeiro ponto, da SEGUNDA linha, da imagem 
..... .....
...... .....
.... ....
..... ....
.... .....
R Número inteiro do tipo unsigned char que define o valor de RED do ÚLTIMO ponto, da ÚLTIMA linha, da imagem 
G Número inteiro do tipo unsigned char que define o valor de GREEN do ÚLTIMO ponto, da ÚLTIMA linha, da imagem 
B Número inteiro do tipo unsigned char que define o valor de BLUE do ÚLTIMO ponto, da ÚLTIMA linha, da imagem 



Programa de conversão de Imagens


Para obter imagens no formato descrito acima utilize o programa ConvImg (Versão para Windows   Versão para Linux ).
Na versão para Linux, este programa converte uma imagem JGP para DAT.
Na versão para Windows, este programa converte uma imagem BMP para DAT.

A ativação do programa pode ser feita das seguintes formas:

ConvImg Teste.jpg Lê a imagem 'Teste.jpg' e converte para Teste.dat  (funciona no Linux)
ConvImg Teste.bmp Lê a imagem 'Teste.bmp' e converte para Teste.dat  (funciona no Windows)
ConvImg Teste.jpg  -DEBUG Lê a imagem 'Teste.jpg', converte para Teste.dat e imprime na tela os dados da imagem.
Pode ser usado para visualizar os dados da imagem.  (funciona no Linux)
ConvImg Teste.bmp  -DEBUG Lê a imagem 'Teste.bmp', converte para Teste.dat e imprime na tela os dados da imagem.
Pode ser usado para visualizar os dados da imagem. (funciona no Windows)
ConvImg Teste.dat Lê a imagem 'Teste.dat' e converte para Teste.jpg  (funciona no Linux)
Lê a imagem 'Teste.dat' e converte para Teste.bmp  (funciona no Windows)


Em todos os casos a imagem é exibida na tela.


Tratamento de Imagens



Há vários tratamentos possíveis sobre uma imagem. Entre eles destacam-se:


Para cada ponto (x,y) da imagem:
    LeCor(x,y, r,g,b);
    // calcula o equivalente cinza da cor
    i = (0.3 * r + 0.59 * g + 0.11 * b)
    // escreve o cinza na imagem
    EscreveCor(x,y, i,i,i)


Para cada ponto(x,y) em uma linha L da imagem, compara-se o ponto com seu vizinho à direita:
    LeCor(x,y, r,g,b);
  // calcula o equivalente cinza da cor
    i1 = (0.3 * r + 0.59 * g + 0.11 * b);
    LeCor(x+1,y, r,g,b); 
  // calcula o equivalente cinza da cor
    i2 = (0.3 * r + 0.59 * g + 0.11 * b);
    Se I1 é muito diferente de I2  // existe uma borda ??
    então EscreveCor(x,y, 0,0,0) // escreve em preto
    se não EscreveCor(x,y, 255,255, 255) // escreve em branco

Repete-se o mesmo para cada coluna da imagem, comparando-se o ponto con seu vizinho abaixo
                   

Para cada ponto (x,y) da imagem:
    LeCor(x,y, r,g,b);
  // calcula o equivalente cinza da cor
    i1 = (0.3 * r + 0.59 * g + 0.11 * b);
    LIMITE = 120; // experimente variar este valor entre 0 e 255
    Se I1 < LIMITE  // é um cinza muito escuro ??
    então EscreveCor(x,y, 0,0,0) // escreve em preto
    se não EscreveCor(x,y, 255,255, 255) // escreve em branco

Lembre-se que neste caso a imagem ten somente pontos brancos e pretos.
Para cada ponto (x,y) da imagem:
    Conte quantos dos 8 pontos ao redor de (x,y) tem a mesma cor que ele.
    Se a contagem resultar em um número menor que 4
    então a cor de (x,y) deve ser invertida.
 

Em breve mais algoritmos de tratamento....

FIM