Grupo:
Rangel Arthur | RA 00110-5 |
Vanio Fragoso de Melo | RA 00110-9 |
Jose Antonio Lujan Menchola | RA 97392-4 |
Professora: Wu Shin Ting
Programa ppmquant
Def: Programa
para quantização de imagens no formato ppm (especificado em infoppm.html),
para determinados número de cores.
Parâmetros de entrada: Para a
executação do programa ppmquant.c, é necessária
a seguinte linha de comando:
ppmquant [-floyd|-fs] número de cores imagem ppm >saida.ppm
sendo:
ppmquant – chamada do executável
do arquivo fonte ppmquant.c
[-floyd|-fs] – opção de
propagação de erro
número de cores – representa
a quantidade de cores da imagem de saída
imagem ppm – imagem original a ser quantizada
saida.ppm – imagem quantizada de saída
Descrição do arquivo fonte ppmquant.c:
O programa é dividido
basicamente em 4 partes, correspondentes a:
1-
Leitura da imagem a ser quantizada
2-
Construção do Histograma
3-
Aplicação do algoritmo de corte de mediana e criação da nova tabela
de cores
4-
Mapeamento das cores da imagem usando a nova tabela de cores
1-
Leitura da imagem
A leitura da imagem a ser quantizada é realizada de forma bastante
simples no programa. É utilizada a função ppm_readppm da seguinte forma:
Pixels = ppm_readppm(ifp, &cols, &rols, &maxval)
onde:
ifp – especifica a abertura do arquivo (acesso ao arquivo)
&cols – especifica o número de colunas ou largura da imagem
&rols – especifica o número de linhas ou altura da imagem
&maxval – especifica o máximo valor da imagem
2-Construção
do Histograma
Após a leitura do arquivo, é construído o histograma da imagem, através
do uso da rotina, já pronta, ppm_computecolorhist, da seguinte forma:
chv = ppm_computecolorhist (pixels, cols, rows, MAXCOLORS, &colors);
A saída do histograma pode ser visualizada através do executável do
UNIX do programa ppmhist.c, da seguinte forma:
ppmhist <imagem ppm>
aparecendo
na tela cinco colunas, com os níveis R, G e B, nas 3 primeiras colunas, lum
na quarta, e counter (frequência) na
última coluna.
A tabela a seguir, mostra parte do histograma da figura aries.ppm:
r g b
lum count
--- --- --- ---
-----
19 19 27
20 367027
45 23 0
27 21814
44 24 0
27 2990
47 23 0
28 2601
19
20 25 20
1895
OBS:
Foram realizadas duas tentativas de construção do histograma:
I-
A primeira tentativa, foi o programa histo.m, construído
pelo grupo mentor. Os problemas foram:
1-
Necessidade de converter a imagem para o formato tiff, já que o Matlab não
trabalha com imagens no formato ppm;
2-
Foram construídos os histogramas de cada cor (R,G e B), sendo que há a
necessidade de se construir um histograma tridimensional;
3-
Processamento muito demorado, já que o uso de loops com comandos for no
Matlab é ineficiente.
II-
Segunda tentativa, programa histpaulo.c, construído
pelo aluno Paulo.
3-
Aplicação
do algoritmo de corte de mediana
O processo de corte de mediana necessita, primeiramente, do número de níveis
de quantização desejado, por exemplo 256 (8 bits).
O algoritmo
de corte de mediana está explicado em mediana.html,
retirada do livro Computação Gráfica I (Jonas
Gomes e Luiz Velho).
Os passos
desse algoritmo são basicamente:
1-
Encontrar o paralelepípedo de volume mínimo que contém todas as cores
na imagem;
2-
Ordenar as cores ao longo das arestas
3-
Dividir o paralelepípedo em duas regiões utilizando a mediana
4-
Repetir os passos anteriores, até que o espaço de cor original tenha
sido dividido no número de níveis de quantização requeridos (células).
Desta
forma, cria-se a nova tabela de cores, pelo comando:
Colormap = mediancut(chv, colors, rows*cols, maxval, newcolors);
onde:
chv – arquivo que contem o histograma da imagem original
colors – quantidade de cores da imagem original
newcolors - nova quantidade
de cores
4-
Mapeamento das cores da imagem usando a nova tabela de cores
Nesta parte, aplica-se o novo mapa de cor na imagem original. Neste
processo, utiliza-se algum tipo de algoritmo para minimizar erros, como
problemas de borda das células (citadas no item 3).
O algoritmo utilizado no programa foi o Floyd-Steinberg, que está
discutido em floyd.html.
Resultados
do processo:
Imagem original | Imagens Quantizadas 8 bits | Imagens Quantizadas 4 bits |
aries.jpg | aries8.jpg | aries4.jpg |
capric.jpg | capric8.jpg | capric4.jpg |
luz1.jpg | luz1_8.jpg | luz1_4.jpg |
OBS: As imagens originais e de saída foram convertidas para o formato jpeg para possibilitar a publicação. A visualização dessas imagens, no entanto, é a mesma.