UNIVERSIDADE DO VALE DO RIO DOS SINOS
Ciências Exatas e Tecnológicas
Curso de Jogos Digitais – Processamento Gráfico - Prof. Leandro Tonietto
Trabalho sobre Processamento de Imagens
Objetivo
Proporcionar prática de manipulação de imagens em memória e em disco. Exercitar a manipulação de paleta de
cores, tiles, tileset e tilemap.
O que deve ser feito
Um programa que leia uma imagem do disco no formato PNM e converta para um arquivo de tiles.
Passos para conversão:
1. O programa deve solicitar ao usuário o caminho do arquivo da imagem, o tamanho final dos tiles, o nome do
arquivo de saída e a diferença máxima para critério de semelhança de tiles. O programa deve ler o arquivo
da imagem no formato PNM para uma matriz de pixels. Neste passo, a dificuldade está em fazer a leitura no
formato PNM (veja especificação no site da disciplina).
2. Dada uma matriz de pixels, a tarefa agora é separar os pixels em tiles do mesmo tamanho. A divisão deve
ser feita da seguinte forma: para cada pedaço de tamanho N X N da matriz, copiar os pontos para a matriz
de pontos do tile atual. Repare que a imagem, neste ponto, nos remete a um tilemap.
3. A tarefa agora é montar um tileset. Entretanto, para fins de economia de espaço, os tiles serão agrupados
por “semelhança”; um tileset otimizado. Isto significa que tiles muito parecidos serão reaproveitados com
um tile único e um novo tilemap deve ser montado para aproveitar esta otimização. Para realizar este
procedimento, o programa deve comparar cada um dos tiles da imagem, com os tiles existentes no tileset,
caso algum tile seja semelhante ele é descartado e passa a ser usado o tile único como índice para o novo
tilemap. Pseudo-algoritmo:
// função que calcula a diferença entre dois pixels
bool calculaDiferenca(Pixel p1, Pixel p2){
int dr = p1.red – p2.red;
dr *= dr;
int dg = p1.green – p2.green;
dg *= dg;
int db = p1.blue – p2.blue;
db *= db;
return sqrt(dr + dg + db);
}
//procedimento que recupera um tile da imagem e insere no tileset (se for o caso)
//e no tilemap novo
//...
Para cada tile da imagem orginal{
tileNovo = imagem.proximoTile();
int índice = -1;
double diferencaTotal = 0;
para tile no tileset {
tileAtual = tileset.proximoTile();
para cada ponto do tile {
Pixel p1 = tileAtual.pixels[i];
Pixel p2 = tileNovo.pixels[i];
diferencaTotal += calculaDiferenca(p1, p2);
}
if(diferencaTotal <= diferencaMaxima){
Av. Unisinos, 950
Caixa Postal 275
CEP 93022-000
São Leopoldo
Fone: (51) 3591-1122 Fax: (51) 3590-8172
Rio Grande do Sul
Brasil
http://www.unisinos.br
Email: [email protected] Site: http://www.inf.unisinos.br/~ltonietto
Página 1/2
UNIVERSIDADE DO VALE DO RIO DOS SINOS
Ciências Exatas e Tecnológicas
índice = índiceAtual;
break;
}
}
if (índice == -1) {
índice = tileset.adicionaTile(tileNovo);
}
tilemap.setTile(x, y, índice);
}
4. O último passo é gravar o novo tilemap num arquivo de tilemap e o relatório. O formato é o seguinte:
a. gravar o tamanho em pixels da imagem gerada pelo tilemap (largura e altura), tamanho dos tiles
(largura e altura) e a quantidade de tiles do tileset. Exemplo:
256 256 16 16 168
b. Próxima informação a ser grava é o tileset. Aqui serão gravados todos os tiles na ordem em que
estão armazenados no tileset. Cada ponto do tile é gravado com 3 valores, um para cada canal de
cor (RGB). Portanto, a cada 3 valores um ponto do tile no arquivo. Deve-se gravar um tile após o
outro, sem separações. Exemplo:
255 255 255 255 254 254 254 253 253 ...
c. Por fim, deve-se gravar o tilemap em si; gravando os índices do tileamap conforme a seqüência da
matriz:
1 1 1 2 3 1 1 ...
d. Como saída ainda do programa, deve-se gerar um relatório com um histograma dos tiles, ou seja, a
freqüência com eles aparecem no tilemap. Este relatório deve ser gerado em arquivo, mostrando
duas visões. A primeira o histograma ordenado pelo índice do tile. E o segundo ordenado pela
freqüência no tilemap, do mais freqüente ao menos freqüente.
Avaliação, itens entregáveis e observações
•
•
•
O trabalho vale 3 pontos na nota do GA. Os critérios de avaliação são:
o 2 pontos para funcionamento: ¼ da nota para cada passo do programa.
o 1 ponto para Código-fonte: lógica de programação e clareza do código-fonte.
o Pontos extras:
Interface gráfica para manipulação do software, com resultados visuais (0,5 pontos)
Acrescentar o passo 3.1, onde se deve considerar uma paleta de cores e os tiles
referenciando cores da paleta otimizada e pixels no sistema RGB. Deve-se alterar o passo 4
para gravar a paleta de cores no arquivo e os índices da paleta como informação de cor dos
tiles (0,5 pontos).
Entrega:
o Data: 17/04/2008
o Deve ser entregue por mail ou diretamente para o professor: o programa compilado e funcionando
(inclusive com bibliotecas), código-fonte compilável e demais arquivos necessários para a execução
do programa.
o Se enviar por e-mail, não esqueça de colocar no assunto do mail:
[PGR-2008-01] Trabalho GA – Fulano e Beltrano.
Observações:
o Código-fonte não compilável não será considerado. Entregas somente dentro do prazo.
o Trabalho deve ser feito em duplas; as mesmas do estudo investigativo.
o Linguagens de programação aceitas: C/C++, Python e Java.
o Fique de olho no site, em especial na especificação do trabalho, pois ela pode sofrer algumas
alterações. Para saber se a versão da especificação que você está seguindo está correta, confira a
da especificação.
o Data da especificação do trabalho: 19/02/2008
Av. Unisinos, 950
Caixa Postal 275
CEP 93022-000
São Leopoldo
Fone: (51) 3591-1122 Fax: (51) 3590-8172
Rio Grande do Sul
Brasil
http://www.unisinos.br
Email: [email protected] Site: http://www.inf.unisinos.br/~ltonietto
Página 2/2
Download

Trabalho sobre PI