PUCRS - Faculdade de Informatica
Laboratorio de Programacao IV, semestre 2004/2.
Prof. Eduardo Augusto Bezerra
 
Trabalho 1: Processamento de Imagem - conversao BMP de colorido para tons de cinza. 
 

O trabalho consiste na implementacao de um programa inteiramente em assembly para a arquitetura 80x86 para realizar a conversao de uma imagem colorida para tons de cinza. Devera' ser utilizado, obrigatoriamente, o sistema operacional Linux. O programa devera' receber como entrada um arquivo BMP com 24 bits de resolucao, nao compactado, e fornecer como saida um arquivo BMP equivalente, porem com a imagem convertida para tons de cinza. A verificacao do correto funcionamento do programa sera' realizada ao se abrir a imagem BMP gerada em um visualizador de imagens BMP.

A seguir estão listadas algumas dicas e material de apoio:

  • Exemplos de programas em assembly do 80x86. Alguns estao no formato apropriado para compilar com o nasm, e executar no Linux (exemplos/)
  • Exemplo de programa para o nasm que trabalha com arquivos/.
  • Exemplo de programa para o nasm que trabalha com strings/.
  • Dicas para trabalhar com arrays.

 

Especificacao

 

O programa devera' abrir o arquivo de entrada e ler o header de 54 bytes de forma a verificar se a imagem contida no arquivo esta' realmente no formato BMP de 24 bits e sem compressao. Em uma imagem BMP sem compressao, cada tres bytes lidos, a partir do header, representa um pixel da imagem, sendo o primeiro byte a cor azul (Blue), o segundo byte a cor verde (Green), e o terceiro byte a cor vermelha (Red). Uma forma de converter um determinado pixel (tres bytes) para tons de cinza, utiliza a seguinte formula: 

Luminosidade = B * 0.11 + G * 0.59 + R * 0.3

onde B e' o primeiro byte (Blue), G o segundo (Green), e R o terceiro (Red).

O valor resultante contido na variavel "Luminosidade" devera' ser atribuido para os tres bytes que compoem o pixel em questao, de forma a gerar a nova imagem em tons de cinza.

A imagem composta pelos pixels RGB (bytes contados de 3 em 3 apos o header) esta' organizada na forma de uma matriz n x m. O numero de linhas n dessa matriz (numero de linhas da imagem) pode ser obtido na posicao 22 do header, e o numero de bytes em cada linha (cada 3 bytes e' um pixel RGB) pode ser obtido na posicao 18 do header do arquivo BMP.

No final de cada linha podem existir bytes de preenchimento que nao fazem parte da imagem. Estes bytes nao podem ser convertidos, e devem ser copiados diretamente para o arquivo de saida. O numero de bytes a serem saltados por linha e' obtido a partir da seguinte equacao:

nr_bytes = ( tamanho_total_do_arquivo - (largura * altura * 3 + 54) ) / altura

Para varrer todos os bytes que compoem todos os pixels da imagem, podera' ser utilizado uma construcao do tipo:

for ( i = 0; i < n; j++ ) {
   for ( j = 0; j < m; i++ ) {

         // realizar a conversao dos pixels e a escrita no arquivo de saida

   }

   if ( nr_bytes > 0 )

      // ler os bytes; e escrever diretamente no arquivo de saida sem processamento.

}

Em resumo, o programa devera' aceitar como arquivo de entrada uma imagem BMP de 24 bits colorida sem compressao, e fornecer como saida um novo arquivo contendo a imagem BMP equivalente em tons de cinza, tambem de 24 bits sem compressao.

 

Etapas sugeridas para o projeto e implementacao do trabalho

 

  1. Desenvolver pequenos programas em assembly para Linux com o nasm de forma a se familiarizar com o processo de montagem e execucao, bem como com as chamadas de sistema do Linux.
  2. Implementar um pequeno programa que realize uma copia de um arquivo de entrada para um novo arquivo de saida.
  3. Implementar um programa que abra um arquivo qualquer, leia os 54 bytes iniciais, e informe se o mesmo se trata de uma imagem BMP de 24 bits sem compressao. Para isso e' necessario entender os campos do header de arquivos BMP.
  4. Entender as explicacoes contidas no item "Especificacao" acima, procurar material extra em livros da biblioteca e/ou na Internet, e implementar o programa completo solicitado. 

 

Entrega e avaliacao

 

  • O trabalho devera' ser realizado por grupos de 4 alunos (siga esse link para a lista de grupos). 
  • Nao serao aceitos trabalhos realizados por grupos com um numero diferente de 4 integrantes, a nao ser que o numero de alunos na turma nao comporte essa divisao. Nesse caso um dos grupos ficara' com 3 ou 5 componentes.  
  • Cada grupo devera' preparar um relatorio descrevendo as estrategias utilizadas para implementar o sistema. 
  • Um dos integrantes sera' sorteado para representar o grupo, apresentando o trabalho desenvolvido. 
  • Serao realizadas perguntas especificas sobre os recursos e estrategias utilizadas para a implementacao do trabalho. 
  • Nesse momento o representante sorteado devera' demonstrar possuir o conhecimento necessario para o desenvolvimento de programas em assembly para a arquitetura alvo. 
  • Durante a apresentacao nao sera' permitido ao membro do grupo sendo questionado solicitar ajuda aos demais. 
  • A avaliacao sera' realizada no horario da aula, um grupo por vez (um representante de cada grupo) na sala de aula. 
  • Os grupos deverao enviar o relatorio e o programa fonte por email para eduardob@inf.pucrs.br ate' 30 minutos antes do inicio da aula do dia da apresentacao
  • Programas nao recebidos por email ate' a data/hora limite nao serao avaliados (dia 10/09/2004 ate' as 20:45). Data da apresentação: 10/09/2004.