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