Trabalho Pratico de Arquitetura de Computadores I - sem 2006/2

Porto Alegre, Novembro de 2006.

Prof. Eduardo Augusto Bezerra

bezerra@inf.pucrs.br

Engenharia da Computacao, FACIN/FENG, PUC-RS


Trabalho Pratico 2: 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 IA32 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.

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.

Exemplos de imagens:


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