CES-11 LAB 03 Bitmap Quadtree Carlos Henrique Q. Forster – Instituto Tecnológico de Aeronáutica 2010
Bitmap Um bitmap é uma matriz de bits que representa uma imagem Podemos definir 1=preto, 0=branco
Quadtree Uma Quadtree é uma árvore quaternária e geralmente está associada à decomposição espacial em quadrantes
Compressão de Imagem Compressão de imagem é uma forma de codificar uma imagem para reduzir o espaço que ocupa em memória ou disco. Todo método de compressão assume uma característica dos dados para a qual a codificação toma um espaço pequeno Se essa condição não é cumprida, pode ser que eventualmente o tamanho codificado seja maior que o tamanho original (muito raro)
Compressão com quadtree A compressão com quadtree assume que há grande probabilidade de regiões vizinha terem a mesma cor Assim, uma região que tem todos os pixels (elemento da imagem) com a mesma cor, é codificada com apenas 2 bits
Nós da quadtree Há dois tipos de nós na quadtree: Os nós que correspondem a regiões de uma única cor Branco Preto Nós que correspondem a regiões com as duas cores Esses nós são folhas da árvore B P Esses nós são nós internos de grau 4 da árvore
Codificando o bitmap O bitmap é particionado sempre que não for de uma só cor
Árvore final
Codificação em bits Cada vez que for gerada uma folha, coloca-se o bit 0 e em seguida o bit correspondente à cor (0=branco 1=preto) Cada vez que for gerada uma ramificação (nó interno), coloca-se o bit 1 e em seguida a codificação de cada subárvore em seqüência
Ou seja... 00 01 1... 1000000101010000 Codificação: 1000000101010000 00 00 00 101010000 Curiosamente, tomou o mesmo espaço (16 bits) que a codificação original 01 01 00 00
93 bits agora!! Maior que os 64 originais Para a imagem grande: Codificação: 1 1000000101010000 110000010010000010001101010100 1001000001010000 101101000101101000000101000000 93 bits agora!! Maior que os 64 originais
E se eu guardar as dimensões da imagem? Boa idéia: Assim, posso representar imagens cujas dimensões não são potências de 2 (basta ignorar os pontos fora da região, considerando-os brancos ou pretos conforme a conveniência) Posso também codificar as folhas no último nível com apenas 1 bit 0=branco 1=preto, já que é sabido que não haverá ramificações!!
Nova codificação: 00 01 1... Se nível=max 1 100000011100 Codificação: 1 100000011100 Codificação: 100000011100 00 00 00 11100 Agora 12 bits, mas tive que guardar o tamanho 4x4 1 1
Novamente para a grande: Codificação: 1 100000011100 110010100100111110 100100110000 101110111100011000 61 bits agora!! Ainda guardo o tamanho 16x16
Tarefa Escrever um programa para: Escrever outro programa para: Ler um arquivo BMP (matriz de bits) preto-e-branco para a memória. Construir uma árvore quadtree a partir do bitmap. Gerar um arquivo binário cujos bits representem a imagem codificada pela quadtree. Escrever outro programa para: Ler a quadtree de um arquivo salvo pelo seu programa. Gerar um arquivo BMP com a imagem decodificada.
Material É fornecido um código de programa que: Lê um arquivo BMP preto e branco para uma estrutura em bytes na memória, Escreve um arquivo BMP dada a estrutura da matriz de pixels, Lê e escreve bit por bit em um arquivo binário aberto Dica: pode ser mais fácil construir a árvore começando das folhas, através de chamadas recursivas.
Conclusões Veja quanto de uma imagem é possível comprimir. Teste com uma imagem maior, como o exemplo pagina.bmp e veja a razão entre o tamanho da imagem original e da quadtree. Veja o quanto essa razão varia para imagens diferentes. Explique que características de uma imagem dificultam ou facilitam a compressão.