O processamento digital de imagens usa intensivamente vetores e matrizes. Uma imagem é geralmente representada como uma matriz de pixels, onde cada pixel é descrito por um ou mais valores inteiros que indicam seus níveis de cor ou de luminosidade. Por isso, processar imagens é uma ótima forma de exercitar o uso de matrizes.
Para facilitar a leitura e escrita dos arquivos de imagem, neste projeto será adotado o formato de imagem Portable Gray Map (PGM), um formato de imagem em níveis de cinza bem simples e fácil de ler/escrever. Boa parte dos programas de tratamento de imagens reconhece o formato PGM.
Eis um exemplo de imagem no formato PGM:
P2 # this is a PGM image 24 7 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0 0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0 0 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 0 0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0 0 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Alguns exemplos de imagens no formato PGM para usar no projeto:
Este projeto visa construir filtros simples para imagens digitais em níveis de cinza, no formato PGM (P2 e P5) com pixels de 8 bits (1 byte).
O filtro negativo consiste em converter cada pixel da imagem em seu complemento. Sendo max o valor máximo para um pixel na imagem, o complemento de um pixel com valor v seria max-v.
Forma de chamada:
pgmnega -i input -o output
Exemplo de entrada e de saída:
O filtro de rotação gira uma imagem em um ângulo θ (>0) no sentido horário, em relação ao seu centro (vide rotação de imagens 2D).
Requisitos:
-a
; se não for informado, por default θ = 90º.Forma de chamada:
pgmrotacao -a N -i input -o output
Exemplo de entrada e de saída para θ = 30º:
O filtro da mediana reduz o nível de ruído de uma imagem sem prejudicar muito sua nitidez. Este filtro consiste basicamente em substituir o valor de um pixel pelo valor da mediana de seus pixels vizinhos. O número de vizinhos a considerar é definido por uma máscara, ou seja, a matriz de vizinhos que circunda o pixel a tratar (incluindo ele mesmo):
Requisitos:
-m
); caso não seja informado, o valor default é 3, para uma máscara de 3×3 pixels.qsort
da biblioteca C (man qsort
).Forma de chamada:
pgmmediana -m N -i input -o output
Exemplo de entrada e de saída:
pgmnega.c
que gera um executável pgmnega
.Makefile
para o projeto:all
(default), clean
e purge
.-Wall
.o
intermediários).c
e .h
Makefile
-i
indica o nome do arquivo de entrada; se não for informado, deve-se usar a entrada padrão (stdin).-o
indica o nome do arquivo de saída; se não for informado, deve-se usar a saída padrão (stdout).Essas opções podem ser usadas em qualquer combinação, ou seja:
// entrada e saída em arquivos pgmmediana -i inputfile.pgm -o outputfile.pgm pgmmediana -o outputfile.pgm -i inputfile.pgm // entrada em arquivo, saída em stdout, vice-versa ou ambos pgmmediana -i inputfile.pgm > outputfile.pgm pgmmediana -o outputfile.pgm < inputfile.pgm pgmmediana < inputfile.pgm > outputfile.pgm // as opções podem estar em qualquer ordem pgmmediana -m 5 -i inputfile.pgm -o outputfile.pgm pgmmediana -i inputfile.pgm -m 5 -o outputfile.pgm pgmmediana -o outputfile.pgm -i inputfile.pgm -m 5