Álgebra Linear Aplicada à Compressão de Imagens Universidade de Lisboa Instituto Superior Técnico Uma Breve Introdução Mestrado em Engenharia Aeroespacial Marília Matos Nº 80889 2014/2015 - Professor Paulo Pinto O uso generalizado de câmaras digitais, telemóveis com a possibilidade de gravação de imagens cada vez com maior resolução, exige uma maior capacidade de armazenamento. Um método chave para reduzir essa exigência é conhecido como compressão de imagem. Este projeto irá explicar esse mesmo método, descrevendo um processo para tal, chamado A Transformação de Haar Wavelet. O que é uma imagem? Uma imagem é um conjunto de pontos discretos chamados de píxeis. O método de compressão de imagens JPEG vê qualquer imagem como uma matriz m x n em que cada entrada da matriz determina a cor de um pixel na imagem. Cada entrada, no entanto, é representada por um dado número de bits. Se cada pixel fosse representado apenas por um bit, apenas duas cores diferentes poderiam aparecer, uma vez que um computador, funcionando com o sistema binário, poderia usar o valor 0 ou 1. Se dois bits fossem usados para representar cada pixel, duas cores poderiam ser representadas (2 x 2 = 4). E por aí em diante. Em suma, o número de cores possíveis de serem representadas é dada pela expressão 2 n, em que o n representa o número de bits por pixel. As imagens mais comuns são as de 8 bits por pixel (um byte) ou 24 bits por pixel (três bytes). Três tipos diferentes de imagens bitmap são, geralmente, usadas. O primeiro tipo são imagens de intensidade (na escala de cinzentos), onde cada entrada da matriz corresponde a um valor entre 0 e 1, em que o 0 corresponde ao branco
puro e 1 ao preto completo. A seguir temos as imagens de 256 cores, onde cada entrada da matriz corresponde a um número entre 0 e 255 que, por sua vez, corresponde a uma cor distinta. Neste, cada pixel requer 8 bits, ou 1 byte de memória. No terceiro tipo de imagem são usadas três matrizes: uma para a escala de vermelho, outra para a escala de verde e a terceira para a escala de azul. Este tipo é também conhecido como RGB (Red, Green, Blue). O processo de compressão de imagens utilizado pela JPEG é denominada pela Transformação Discreta do Cosseno. No entanto existem outros processos de compressão de imagens, entre os quais a Transformação Discreta de Wavelet, que tem muitas mais aplicações na vida real. A primeira Transformação Discreta de Wavelet foi inventada pelo Matemático Húngaro Alfréd Haar e, por isso mesmo, denomina-se de Transformação Haar Wavelet que irá ser apresentada neste projeto. Quando recuperadas da Internet, as imagens digitais demoram uma quantidade considerável de tempo para serem descarregadas e fazem uso de uma grande quantidade de espaço. A transformação Haar Wavelet combateu essa tendência comprimindo, então, as imagens digitais de forma a que ocupassem menos espaço quando armazenadas e transmitidas. A ideia principal por detrás deste método de compressão é a de tratar a imagem digital como um conjunto de números i.e., uma matriz. Cada imagem, como descrito anteriormente, corresponde a um conjunto de píxeis. A matriz correspondente a uma certa imagem contém um número inteiro para cada pixel. A técnica de compressão JPEG divide uma imagem em blocos 8x8, e cada bloco contém uma matriz. Esta técnica utiliza ferramentas de Álgebra Linear para maximizar a compressão e manter um nível elevado e detalhe.
Transformação de vetores usando Haar Wavelets Antes de exemplificar a transformação de matrizes, é necessário verificar como é feita a transformação de vetores (linhas de matrizes). Utilizando, por exemplo, o vetor: v = [420 680 448 708 1260 1420 1600 1600] que é uma linha da matriz 8x8 da imagem. No geral, se o vetor tem 2 k elementos, então o processo de transformação, precedente da compressão, realiza-se em k passos. No caso acima, em 3 passos, uma vez que 8=2 3.
Tem de se efetuar as seguintes operações nas entradas do vetor v: - Dividir as entradas de v em quatro pares: (420, 680), (448, 708), (1260, 1410), (1600, 1600). - Calcular a média de cada par: Os valores formarão as primeiras quatro entradas do novo vetor v1. - Subtrair cada um dos valores calculados nas médias à primeira entrada de cada par e daí resultam os seguintes números: -130, -130, -75, 0, que formarão as quatro últimas entradas do vetor v1. - Formação do novo vetor: v1 = [550 578 1340 1600-130 -130-80 0].
É preciso notar que o vetor v1 pode ser obtido a partir do vetor v, multiplicando este à direita pela seguinte matriz: Os primeiros quatro coeficientes de v1 são chamados de coeficientes de aproximação e as últimas quatro entradas são chamadas de coeficientes de detalhe. O próximo passo é voltar a agrupar as entradas do vetor v1, mas desta vez só se agrupa as primeiras quatro entradas, formando dois grupos com dois elementos cada. Desta operação resulta estas duas entradas: 564 e 1470 do novo vetor v2. Estes são os novos coeficientes de aproximação. O terceiro e o quarto elemento de v2 são obtidos pela subtração das médias 564 e 1470 aos primeiros elementos de cada par correspondente. Isto resulta nos novos coeficientes de detalhe: -14 e -130. As últimas quatro entradas de v2 são os coeficientes de detalhe de v1, e assim tem-se: v2 = [564 1470-14 -130-130 -130-80 0], o segundo vetor da transformação, que por sua vez pode ser obtido do vetor v1 pela multiplicação à direita pela matriz:
O último passo consiste, mais uma vez, em calcular a média das primeiras duas entradas do vetor v2 e, como anteriormente, subtrair o resultado à primeira entrada do par. Isto resulta no seguinte vetor: v3 = [1017-453 -14-130 -130-130 -80 0] Como anteriormente, o vetor v3 pode ser obtido por de v1, multiplicando v2 à direita pela matriz:
Como consequência, v3 resulta imediatamente de v através da seguinte expressão: Seja: v3 = v x W1 x W2 x W3 Observações: - As colunas da matriz W1 formam uma base ortogonal de R 8. Como consequência, W1 é invertível. O mesmo acontece com a matriz W2 e W3. - Como produto de matrizes invertíveis, W é também invertível e as suas colunas formam uma base ortogonal de R 8. A inversa de W é dada pela expressão: Supondo que a matriz A é a matriz que corresponde a uma certa imagem, a transformação de Haar processa-se realizando as operações anteriormente descritas em cada uma das linhas da matriz A, e depois repetindo as mesmas operações nas colunas da matriz resultante. A matriz transformada é AW. A transformação das colunas de AW é obtida através da multiplicação deaw pela matriz W T, a transposta de W, à esquerda. Em suma, a transformação de Haar
modifica a matriz A e calcula a matriz W T AW. Nomeando esta nova matriz de S, temos então: Usando as propriedades da matriz inversa, pode-se obter de novo a matriz original, através da expressão: Isto permite-nos ver a imagem original. Exemplo: Supondo que uma imagem 8x8 é representada pela matriz:
Ao transformarmos as linhas da matriz A obtemos: Transformando, por fim, as colunas da matriz L, é obtida a seguinte matriz:
O objetivo de proceder à transformação de Haar wavelet é que entradas da matriz original que contêm pequenas variações acabarão com o valor zero na matriz transformada. A matriz é considerada esparsa se tiver uma grande quantidade de entradas iguais a zero. Este tipo de matriz demora muito menos espaço no seu armazenamento. Uma vez que não se pode esperar que todas as matrizes tenham a maior parte das suas entradas iguais a zero, decidiu-se definir uma valor conhecido por vizinhança, ε, e assim, todas as entradas da matriz que tenham valor inferior a ε passam a ter o valor de 0. Se ε for zero, nenhum dos elementos da matriz é modificado. Sempre que pretendemos descarregar uma imagem da Internet, o computador de origem usa a matriz transformada de Haar na sua memória. Primeiramente envia os valores dos coeficientes de aproximação e os de detalhe maiores e, só mais tarde, os coeficientes de detalhe com valores inferiores. Assim, o computador recebe a informação, começa o processo de reconstrução progressivamente até ao maior detalhe, até que a imagem original seja completamente reconstruída. Álgebra Linear consegue tornar o processo de compressão muito mais rápido e muito mais eficiente. Em primeiro lugar é necessário referir que uma matriz A nxn, diz-se ortogonal se as suas colunas formam uma base ortonormada de R n, isto é, as colunas de A são ortogonais duas a duas e o comprimento de cada vetor coluna é igual a 1. Da mesma forma que A é ortogonal se a sua inversa é igual à sua transposta. Esta última propriedade faz com que a imagem seja recuperada através da equação: que torna o processo mais rápido.
Uma outra propriedade bastante importante referente às matrizes ortogonais é a da preservação da sua norma. Por outras palavras, se v é um vetor de R n e A uma matriz ortogonal, então Av = v, pois: Além disso, o ângulo é preservado quando é feita a transformação através de matrizes ortogonais. Relembrando que o coseno de um ângulo entre dois vetores u e v é dado por: então, se A é uma matriz ortogonal, ψ o ângulo entre os dois vetores Au e Av, temos:
Uma vez que a norma e o ângulo é preservado, há uma muito menor distorção produzida na reconstrução da imagem quando é usada uma matriz ortogonal. W é o produto de três outras matrizes e, por isso mesmo, podemos normalizar W, normalizando cada uma das outras três matrizes. A versão normalizada de W será: Podemos notar também, que a matriz W não é mais do que uma matriz mudança de base de R 8. Por outras palavras, as colunas de W formam uma nova base de R 8. Por isso mesmo, quando multiplicamos um vetor v, escrito nas coordenadas da base canónica de R 8, por W, obtêm-se as coordenadas de v na nova base. Algumas coordenadas vão ser negligenciadas no processo de transformação da matriz numa matriz esparsa, o que fará com que o processamento e transmissão da imagem se dê muito mais rapidamente.