PUCRS
Faculdade de Informática
LAPRO I (EC)
Trabalho Final
O objetivo deste trabalho é desenvolver um programa capaz de ler, tratar e gravar uma imagem.
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");
}
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.
Há vários tratamentos possíveis sobre uma imagem. Entre eles destacam-se:
- Conversão de uma imagem para tons de cinza:
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)
- Detecção de bordas de uma Imagem
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
- Conversão para imagens preto e branco
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
- Remoção de ruído em imagens preto e 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