Você está na página 1de 18

Análise em Componentes Principais∗

Processamento Estatı́stico de Sinais

1o Semestre de 2005/2006

1 Introdução

Muitos dos algoritmos clássicos de processamento de sinal recorrem, de uma ou de outra forma,
a métodos de descorrelação de dados. As vantagens de tais técnicas baseiam-se num princı́pio
relativamente simples: ao descorrelacionar os dados, estamos a eliminar parte da informação
redundante em cada dimensão. Certos sinais, como é o caso de sinais fala ou de imagens, que
apresentam uma substancial correlação entre amostras ou “pixeis” consecutivos, são os can-
didatos ideais para os algoritmos de descorrelação. Os benefı́cios resultantes são vários: os
dados podem ser descritos de uma forma mais concisa, certas caracterı́sticas escondidas dos
dados podem vir à luz depois de transformadas, a distribuição dos dados pode ser represen-
tada (aproximadamente) pelas densidades individuais de cada dimensão. Porventura, um dos
métodos mais utilizados para a descorrelação de dados, é o método denominado análise em
componentes principais (ACP).

O objectivo da análise em componentes principais é encontrar uma transformação mais re-


presentativa e geralmente mais compacta das observações. O método de ACP transforma um
vector aleatório x ∈ Rm noutro vector y ∈ Rn (para n ≤ m) projectando x nas n direcções
ortogonais de maior variância - as componentes principais. Estas componentes são individu-
almente responsáveis pela variância das observações, e neste sentido, representam-nas mais
claramente. Geralmente grande parte da variância dos dados é explicada por um número redu-
zido de componentes, sendo possı́vel descartar as restantes sem grande perca de informação.
De facto, é possı́vel demonstrar que o método de ACP é uma técnica óptima de redução li-

Por Gonçalo Marques
2 Requisitos Teóricos 2

near de dimensão, relativa ao erro quadrático médio. Tal redução é vantajosa para compressão,
visualização dos dados, redução do cálculo necessário em fases de processamento posteriores,
etc. . .

As estimação das componentes principais é relativamente simples. Basta utilizar a informação


contida na matriz de covariância dos dados. No entanto, antes de descrever o método de análise
em componentes principais, primeiro é necessário rever alguns conceitos utilizados em ACP.

2 Requisitos Teóricos

Os conceitos abordados nesta secção lidam com matrizes de covariância de vectores aleatórios
e com a decomposição em valores e vectores próprios destas matrizes. De seguida é definida a
notação utilizada.

Notação

• Variáveis e escalares são representados com letras minúsculas (ex. x, α, . . . )


• Vectores são representados com letras minúsculas a carregado (ex. x, α, . . . )
• Matrizes são representadas com letras maiúsculas a carregado (ex. A, Λ, Σ, . . . )
• Sı́mbolos utilizados para representar certas variáveis, vectores, ou matrizes:
– µx média da variável aleatória x
– σx2 variância da variável aleatória x
– µx média do vector aleatório x
– Σx matriz de covariância do vector x
– I matriz de identidade
– R conjunto real
– λ valor próprio
– γ vector próprio
• Notação de funções utilizadas:
– E{·} operador valor esperado
– |A| determinante da matriz (quadrada) A
– kxk norma do vector x

2
2.1 Transformações Lineares e Matrizes de Covariância 3

2.1 Transformações Lineares e Matrizes de Covariância

Considere um vector aleatório x ∈ Rm , com uma média µx , e com uma matriz de covariância
Σx . Considere ainda a seguinte transformação:
 
     
x1
y1 a1,1 · · · a1,m   b
       1
.  . .. ..   ..   .. 
y =  ..  =  .. . .   .  +  .  = Ax + b (1)
      
 
yn a1,n · · · an,m bn
xm

onde A ∈ Rn×m e {b, y} ∈ Rn . O vector de média µy , e a matriz de covariância Σy de y são


facilmente calculáveis:

µy = E {y} = E {Ax + b} = Aµx + b


n  n⊤ o o

Σy = E y−µy y−µy = E (Ax+b−Aµx −b) (Ax+b−Aµx −b) (2)
n o

= AE (x − µx ) (x − µx ) A⊤

Σy = AΣx A⊤

Como era de espera, o vector b da equação (1), não afecta o valor da matriz de covariância, Σy :
b só afecta a média de y. De notar ainda que as matrizes de covariância têm que satisfazer as
seguintes propriedades:

• Matrizes de covariância são matrizes quadradas e simétricas.

• Para um vector aleatório x = [x1 , . . . , xd ]⊤ , com média µx a matriz de covariância Σx , é


dada por: n o
⊤ 
Σx = E (x − µx ) (x − µx ) = E xx⊤ − µx µ⊤ x
 
E {x21 } − µ2x1 . . . E {x1 xd } − µx1 µxd
 
 
=  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
 
E {x1 xd } − µx1 µxd . . . 2
E {xd } − µxd 2 (3)
 
2
σx1 . . . σx1 σxd ρx1 xd
 
 
= . . . . . . . . . . . . . . . . . . . . . . . . 
 
2
σxd σx1 ρx1 xd . . . σxd
onde µxi e σx2i são respectivamente a média e a variância de xi , e onde ρxi xj é o coeficiente
de correlação entre xi e xj .
O coeficiente de correlação ρxi xj é uma medida de dependência entre as variáveis xi e xj ,

3
2.2 Valores e Vectores Próprios 4

e é dado por:
E {xi xj } − µxi µxj
ρxi xj =
σxi σxj
e satisfaz as seguintes propriedades:
– −1 ≤ ρxi xj ≤ +1
– Para ρxi xj = ±1, xi e xj são totalmente correlacionadas (ex. xj = axi + b)
– Para ρxi xj = 0, xi e xj são descorrelacionadas
– Se xi e xj são independentes, então ρxi xj = 0. Convém no entanto notar que
descorrelação não implica independência: se ρxi xj = 0 não quer dizer que as
variáveis xi e xj sejam independentes.

• A matriz de covariância Σx , dum vector aleatório real x, é uma matriz semi-definida


positiva: x⊤ Σx x ≥ 0 (i.e os valores próprios de Σx são superiores ou iguais a zero)

2.2 Valores e Vectores Próprios

Uma matriz quadrada A de n × n é um operador linear T de Rn → Rn . Um vector γ ∈ Rn não


nulo é um vector próprio de A se existir um escalar λ tal que Aγ = λγ (o vector transformado
Aγ é paralelo ao vector original γ). Sendo γ e λ respectivamente um vector próprio e um valor
próprio de A, obtemos:

Aγ = λγ (4a)

(A − λI) γ = 0 (4b)

A − λI = 0 (4c)

A equação (4c) é denominada a equação caracterı́stica do operador T ou da matriz A. As


raı́zes desta equação são os valores próprios de A. Para calcular um vector próprio γ associado
ao valor próprio λ, basta resolver a equação (4b).

Exemplo: Considere a transformação linear T de R3 →R3 representada pela matriz A.

T (x, y, z) = (3x − y + z, −x + 5y − z, x − y + 3z)


 
3 −1 1
 
 
A = −1 5 −1
 
1 −1 3

4
2.2 Valores e Vectores Próprios 5

A equação caracterı́stica da matriz anterior é:




3 − λ −1 1


|A − λI| = −1 5 − λ −1 = 0


1 −1 3 − λ


5 − λ −1 −1 −1 −1 5 − λ
|A − λI| = (3 − λ)
− (−1)

+ (+1)
=0

−1 3 − λ 1 3 − λ 1 −1
λ3 − 11λ2 + 36λ − 36 = 0
(λ − 2)(λ − 3)(λ − 6) = 0

Os valores próprios de A são λ1 = 2, λ2 = 3, λ3 = 6. Substituindo λi (i = 1, 2, 3) na equação


(4b) permite calcular os vectores próprios correspondentes:

• Para λ1 = 2 temos     
1 −1 1 x 0
    
    
−1 3 −1 y  = 0
    
1 −1 1 z 0

o que admite uma infinidade de soluções do tipo: x = −z, y = 0 (ex. γ 1 = [1, 0, −1]⊤ ).

• Para λ2 = 3 temos     
0 −1 1 x 0
    
    
−1 2 −1 y  = 0
    
1 −1 0 z 0

solução: x = y = z (ex. γ 2 = [1, 1, 1]⊤ ).

• Para λ3 = 6 temos     
−3 −1 1 x 0
    
    
−1 −1 −1 y  = 0
    
1 −1 −3 z 0

solução: y = −2x, x = z (ex. γ 3 = [1, −2, 1]⊤ ).

Sendo A uma matriz n×n com valores próprios distintos (λi 6= λj , ∀i 6= j, para i, j = 1, . . . , n),
existe um único vector próprio γ i associado a cada valor próprio λi 1 . No entanto, os vectores
próprios são indeterminados respectivamente a um factor de escala. Relativamente ao exemplo
1
No caso de haver um valor próprio com uma multiplicidade k > 1, poderá haver número entre 1 e k vectores
próprios associados ao valor próprio.

5
2.2 Valores e Vectores Próprios 6

anterior, qualquer vector αi γ i , i = 1, 2, 3 , para αi 6= 0, também é vector próprio da matriz


A. No sentido e eliminarmos esta indeterminação, iremos convencionar que doravante os vec-
tores próprios têm norma unitária2. Seguindo esta convenção, os vectores próprios do exemplo
anterior passam a ser γ i /kγ i k:
     
1 1 1
1 
 
 1 
 
 1 
 

γ1 = √  0  , γ 2 = √ 1 , γ 3 = √ −2
2  3  6 
−1 1 1

De notar que em ambiente M ATLAB, os vectores próprios retornados pela função eig também
têm norma unitária:

>> A=[3 -1 1;-1 5 -1;1 -1 3]


A =
3 -1 1
-1 5 -1
1 -1 3
>> [V,U]=eig(A)
V =
0.7071 -0.5774 0.4082
-0.0000 -0.5774 -0.8165
-0.7071 -0.5774 0.4082
U =
2.0000 0 0
0 3.0000 0
0 0 6.0000

Os valores próprios de A são os elementos da diagonal da matriz U, e as colunas da matriz


V, são os vectores próprios correspondentes. Normalmente a função eig devolve os valores
próprios ordenados por ordem ascendente, no entanto, convém verificar a ordenação visto esta
nem sempre é implementada.
2
De notar que a norma unitária dos vectores próprios é apenas uma convenção adoptada neste documento.

6
2.3 Descorrelação de Dados 7

2.3 Descorrelação de Dados

Seja Σx a matriz de covariância do vector aleatório, real, x. Se Σx for uma matriz não-singular3 ,
então Σx pode ser decomposto no seguinte produto matricial:

Σx = Γx Λx Γ⊤
x

para
 
  λ 0 ··· 0
γ · · · γ1n  1  (5)
 11  .. 
 .. .

..     0 λ2 0 .
Γx =  . . . .  = γ 1, · · · , γ n Λx =  
 .. .. 
  . 0 . 0
γn1 · · · γnn  
0 · · · 0 λn

em que λ1 , . . . , λn são os valores próprios (positivos) de Σx e γ 1 , . . . , γ n os vectores próprios


correspondentes. Para matrizes simétricas (como é o caso de Σx ) os vectores próprios são
ortogonais: γ ⊤
i γ j = 0 para i 6= j. De notar que cada coluna de Γx é um vector próprio, e por

isso Γx é uma matriz ortogonal: Γx Γ⊤ ⊤


x = Γx Γx = I.

Este resultado possibilita-nos facilmente de descorrelacionar o vector x através de uma


transformação linear. Para a seguinte transformação (com A = Γ⊤
x)

y = Ax = Γ⊤
xx (6)

obtemos (ver equação (2)):

Σy = AΣx A⊤ = Γ⊤ ⊤ ⊤
x Σx Γx = Γx Γx Λx Γx Γx = Λx (7)
| {z }
Σx

Sendo a matriz Σy uma matriz diagonal, implica que os elementos do vector y são descorre-
lacionados entre si. Adicionalmente, cada valor próprio da matriz Σx corresponde ao valor da
variância σy2i , de cada dimensão de y. É habitual ordenar matriz Λx de forma a que os valores
próprios estejam em ordem descendente (i.e. λ1 ≥ λ2 ≥ . . . λn ). Sendo Γx a matriz de vectores
próprios correspondente as valores próprios ordenados, a transformação da equação (6) dá-nos
um vector y cujas primeiras dimensões variam mais do que as últimas.
3
Matrizes não-singulares são matrizes invertı́veis (se A for não-singular, então o determinante |A| =
6 0). De
notar que matrizes de covariância não-singulares também são definidas positivas (A ∈ Rn×n é uma matriz definida
positiva se x⊤ Ax > 0 para qualquer vector x ∈ Rn , real e não nulo).

7
3 Análise em Componentes Principais 8

3 Análise em Componentes Principais

A transformação da equação (6) projecta x em direcções ortogonais de modo que o vector


transformado y tenha uma matriz de covariância diagonal. Cada dimensão yi do vector y tem
uma variância σy2i igual ao valor próprio λi . Esta transformação é geralmente conhecida como
análise em componentes principais ou para o caso particular de imagem também é denomi-
nada transformação de Karhunen e Loève4 . As componentes principais são simplesmente os
vectores próprios da matriz de covariância de x. A primeira componente principal é o vector
próprio associado ao valor próprio mais elevado, a segunda componente principal é o vector
próprio correspondente ao segundo valor próprio mais elevado, e assim por diante. Quando
lidamos com dados muito correlacionados, como é o caso de pixeis vizinhos numa imagem,
existe geralmente uma grande diferença entre o maior e o menor valor próprio de Σx . Podemos
depreender que para y = Γ⊤
x x, também existe a mesma diferença de valor nas variâncias das

componentes y. Isto indica-nos que certas componentes de y variam muito pouco relativamente
a outras, e, nestes casos, podemos descartar as dimensões de menor variância sem afectar subs-
tancialmente a qualidade do dados. Os próximos exemplos ilustram este facto.

3.1 Exemplo: Compressão de Dados Sintéticos

Pretende-se ilustrar o processo de descorrelação, compressão e reconstrução de dados sintéticos


bidimensionais. Ao longo do exemplo serão também dadas as instruções em código M ATLAB
de maneira a todos os passos aqui efectuados possam ser reproduzidos.

3.1.1 Geração de Dados

Considere que os dados com os quais pretendemos fazer a análise em componentes principais
estão representados na seguinte figura:
4
Outra denominação menos utilizada é a transformação de Hotelling

8
3.1 Exemplo: Compressão de Dados Sintéticos 9

x2
3

−1
−1 0 1 2 3 4 5 6 7

x
1

Dados originais.

Estes dados consistem em 100 pontos bidimensionais, gerados sinteticamente em M ATLAB com
as seguintes instruções:

>> randn(’seed’,0),rand(’seed’,0)
>> x=[1 -1;1 1]*[rand(1,100)*6;randn(1,100)*sqrt(0.01)];

3.1.2 Cálculo da Matriz de Covariância

O comando cov(x) de M ATLAB retorna a matriz de covariância do conjunto x:

>> Cx=cov(x’)
Cx =
3.1013 3.0554
3.0554 3.0459

De notar que se pode calcular esta matriz analiticamente. O conjunto pontos x foi obtido
 
com uma transformação do tipo x = As, com a matriz A = 11 −1 ⊤
1 . O vector s = [s1 , s2 ] foi

gerado com o comando:


[rand(1,100)*6;randn(1,100)*sqrt(0.01)]

Isto significa que a primeira dimensão s1 , é uma variável aleatória uniformemente distribuı́da
entre [0, 6] e a segunda dimensão s2 é uma variável aleatória gaussiana de média nula e variância
σs22 = 0.01. Adicionalmente s1 e s2 são independentes, e por isso a matriz de covariância Σs de
s é uma matriz diagonal:    
2
σs 0 3 0
Σs =  1 = 
0 σs22 0 0.01

9
3.1 Exemplo: Compressão de Dados Sintéticos 10

onde o valor de σs21 foi obtido segundo


Z 6 Z 6
2 1 1
σs21 = (s1 − µs1 ) ds1 = (s1 − 3)2 ds1 = 3
0 6 6 0

Assim, a matriz de covariância de x é (ver equação (2))


 
3.01 2.99
Σx = AΣs A⊤ =  
2.99 3.01

Esta matriz difere da matriz obtida experimentalmente, com o comando Cx=cov(x’). Convém
realçar que Cx é apenas uma estimativa calculada com um conjunto de 100 pontos. No limite,
para um número infinito de pontos, os valores de Cx seriam iguais aos da matriz Σx .

3.1.3 Cálculo dos Valores e Vectores Próprios da Matriz de Covariância

Os valores e vectores próprios são obtidos com o seguinte comando:


>> [V,U]=eig(Cx)
V =
0.7039 -0.7103
-0.7103 -0.7039
U =
0.0181 0
0 6.1292

Os valores próprios da matriz de covariância dos dados são os elementos da diagonal da ma-
triz U e os vectores próprios correspondentes são as colunas da matriz V. Os vectores próprios
indicam as direcções em que os dados variam mais. De notar que o segundo valor próprio é
consideravelmente superior ao primeiro. Isto significa que os dados estão distribuı́dos princi-

palmente ao longo da direcção do segundo vector próprio γ 2 = [−0.7103, −0.7039]⊤ : basta
sobrepor os vectores próprios e os dados originais para constatar este facto.

10
3.1 Exemplo: Compressão de Dados Sintéticos 11

x2
3

−1
−1 0 1 2 3 4 5 6 7

x
1
Dados originais e os vectores próprios (centrados na média dos
dados). A cheio estão representados os vectores próprios (de
norma unitária). As rectas a tracejado seguem as direcções dos
vectores próprios e foram incluı́das para facilitar a visualização
destas direcções).

O vector γ 2 é a componente principal dos dados, e o vector γ 1 (a 1a coluna da matriz V) é


a segunda componente principal. Ao projectar os dados nestas direcções estamos a fazer uma
análise em componentes principais.

3.1.4 Projecção dos Dados nas Componentes Principais

Antes de projectar os dados x nas componentes principais vamos ordenar a matriz de vectores
próprios por ordem descendente de grandeza: neste caso basta trocar a primeira com a segunda
coluna da matriz V.
>> Vo=V(:,2:-1:1);

Ao transformarmos os dados x pelo transposto da matriz Vo, iremos obter um conjunto descor-
relacionado, com variâncias iguais aos valores próprios da matriz Cx:
>> y=Vo’*x;
>> cov(y’)
ans =
6.1292 0.0000
0.0000 0.0181

11
3.1 Exemplo: Compressão de Dados Sintéticos 12

2
0

y
−1

−2

−3

−4

−5
−9 −8 −7 −6 −5 −4 −3 −2 −1 0

y
1

Dados projectados nas componentes principais

O vector y não é mais do que uma transformação linear e bijectiva do vector x: isto é, o conjunto
de pontos representados na figura anterior contém a mesma informação que o conjunto original.
Para recuperar os dados originais basta fazer a transformação inversa (multiplicar o vector y
pela matriz de vectores próprios Γx ). É fácil de ver que com esta transformação iremos obter
exactamente os mesmos dados que tı́nhamos à partida:

y = Γ⊤
xx

ao transformar y pela matriz Γx obtemos:

z = Γx y = Γx Γ⊤ x=x
| {z x}
I

3.1.5 Compressão de Dados

Os dois conjuntos x e y contêm a mesma informação mas existe uma diferença fundamental
entre os dois: no conjunto x as variâncias da primeira e da segunda coordenada são aproximada-
mente iguais. No conjunto y, os dados variam essencialmente ao longo da primeira dimensão.
Podemos então descartar os valores da segunda coordenada sem perder muita informação. No
M ATLAB basta multiplicar x pela componente principal (transposta):
>> yc=Vo(:,1)’*x;
>> size(yc)
ans =
1 100

Os dados do conjunto yc são unidimensionais (a segunda dimensão do conjunto y foi

12
3.2 Exemplo: Compressão de Imagem 13

deitada fora). Em termos de armazenamento, o conjunto yc precisa de metade da memoria do


conjunto y (ou do conjunto x).

Se utilizarmos o conjunto yc para recuperar os dados, irá haver uma perda de informação.
No entanto iremos ganhar em termos de compressão visto que necessitamos aproximadamente
de metade da memória do que seria necessário para armazenar o conjunto original. Os dados
recuperados só com um vector próprio são:

>> xc=Vo(:,1)*yc;
>> size(xc)
ans =
2 100

4
xc2

−1
−1 0 1 2 3 4 5 6 7

xc
1

Dados recuperados com uma componente principal

Comparando a figura anterior com os dados originais podemos ver que de facto houve perdas de
informação: a variação longo da componente principal foi preservada, mas a variação ao longo
da segunda componente é inexistente.

3.2 Exemplo: Compressão de Imagem

Em vários algoritmos clássicos de compressão de imagem é aplicado o mesmo principio do


exemplo 3.1. Não é o objectivo desta cadeira estudar estes algoritmos, pretende-se apenas ana-
lisar quais as possibilidade e os resultados da descorrelação de dados (mais especificamente de
sinais de imagem). Para tal é necessário representar a imagem de maneira a poder descorrelacio-
nar os dados e descartar as dimensões menos relevantes. Uma das representações habitualmente
utilizadas consiste em dividir a imagem em blocos de m × m pixeis, e considerar cada um desse

13
3.2 Exemplo: Compressão de Imagem 14

blocos como uma amostra do vector aleatório x (se m = 2 então x ∈ R4 ,se m = 3 então
x ∈ R9 ,etc. . . ). Por exemplo, considere que uma imagem a nı́veis de cinzento de 256 × 256
pixeis, foi dividida em blocos de 8 × 8 pixeis. Podemos então representar esta imagem por
um conjunto de 1024 vectores num espaço em R64 . Depois, é necessário calcular a matriz de
covariância do conjunto e fazer uma decomposição em valores e vectores próprios desta matriz.
Para comprimir a imagem, temos que escolher um subconjunto de vectores próprios (associa-
dos aos maiores valores próprios), transformar os dados pela matriz compostas pelos vectores
próprios escolhidos, e guardar os dados transformados e a matriz de transformação. Para recu-
perar a imagem original basta fazer a transformação inversa. Todos estes passos são, de seguida,
ilustrados com uma imagem do M ATLAB.

Considere a seguinte imagem a nı́veis de cinzento de 256 × 256 pixeis:

Imagem original.

Esta imagem foi obtida com o comando:


>> [I]=im2double(imread(’cameraman.tif’));

Vamos agora dividir a imagem em blocos de 8 × 8 com ajuda da função blkimag (esta
função é dada em apêndice):
>> [x]=blkimag(I,8);
>> size(x)
ans =
64 1024
O conjunto x representa a imagem original dividida em blocos. Cada coluna de x é um
bloco de 8 × 8. O seguinte comando calcula a matriz de covariância dos dados e faz uma
decomposição em valores e vectores próprios dessa matriz:

>> [V,U]=eig(cov(x’));

14
3.2 Exemplo: Compressão de Imagem 15

Os seguintes comandos ordenam as matrizes de valores e vectores próprios em ordem de-


crescente:
>> Ud=diag(U);
>> [tmp,ind]=sort(Ud);
>> ind=ind(64:-1:1);
>> Vo=V(:,ind);
>> Uo=diag(Ud(ind));
3.5 2

1
3
0

2.5 −1

−2

log(λi)
2
−3
i
λ

−4
1.5

−5

1 −6

−7
0.5
−8

0 −9
0 10 20 30 40 50 60 0 10 20 30 40 50 60
i i

Figura da esquerda em escala logarı́tmica


Gráfico do valores próprios da matriz de
para melhor visualizar a diferença entre va-
covariância dos dados.
lores.

As figuras anteriores mostram que os primeiros valores próprios são substancialmente mais
elevados do que os restantes. As primeiras componentes principais são as direcções em que os
dados têm a maior variância. As restantes componentes podem ser descartadas sem se perder
muita informação visto que nestas direcções os dados variam muito pouco. Assim, não é ne-
cessário guardar toda a informação contida na imagem (no conjunto x: podemos projectar x
nas primeiras componentes principais, e guardar o conjunto transformado. Por exemplo, se só
tivermos em conta as primeiras 8 componentes, ao transformarmos os dados passamos a ter um
conjunto de 1024 pontos a 8 dimensões (em vez das 64 dimensões). Obtemos aproximadamente
um factor de compressão de 8. No entanto existem perdas neste tipo de compressão. Para visu-
alizarmos a degradação ocorrida, temos que reconstruir a imagem com os dados transformados.
Estes passos são:
y=Vo(:,1:8)’*x;
xc=Vo(:,1:8)*y;
Ic=unblkimag(xc,8,256,256);

15
3.2 Exemplo: Compressão de Imagem 16

onde a função unblkimag é dada no apêndice. A imagem reconstruı́da conjuntamente com


o erro de reconstrução são dados nas seguintes figuras. Na figura da direita, o valor do erro foi
representado por nı́veis de intensidade: pixeis a preto correspondem a valores nulos do erro e
pixeis a branco correspondem a valores elevados do erro.

Imagem reconstruı́da. Erro de reconstrução .


Na imagem reconstruı́da podemos ver o efeito de termos descartado 56 das 64 dimensões
dos dados. De notar que cada bloco de 8 × 8 da imagem reconstruı́da é obtido com uma soma
ponderada de 8 vectores (as primeiras 8 componentes principais). Este processo descrito pela
seguinte operação
xc = Γc y = γ 1 y1 + γ 2 y2 + · · · + γ 8 y8

onde xc ∈ R64 é o vector que correspondente aos blocos de 8 × 8 da imagem reconstruı́da, onde
Γc ∈ R64×8 é uma matriz composta pelas 8 componentes principais (os 8 vectores próprios
γ i associados aos 8 valores próprios mais elevados), e onde y = [y1 , . . . , y8 ]⊤ são os dados
transformados.

Cada componente principal é um vector em R64 , e para visualizar cada componente pode-
mos representa-la por um bloco de 8 × 8 pixeis. Como no total existem 64 componentes, iremos
obter uma imagem com 64 blocos de 8 × 8.

16
3.2 Exemplo: Compressão de Imagem 17

Componentes principais da imagem cameraman.tif.


Cada componente é um bloco de 8 × 8 pixeis, e as compo-
nentes estão ordenadas em ordem decrescente de grandeza:
a primeira linha corresponde às 8 primeiras componentes, a
segunda linha às 8 seguintes, etc. . .

Na imagem reconstruı́da, cada bloco foi obtido com uma soma ponderada dos 8 primeiros
blocos da imagem anterior (a primeira linha desta imagem).

Para efeitos de comparação, estão de seguida representadas as imagens reconstruı́das com 4,


8, 16 e 32 componentes principais. Quando preservamos unicamente 4 componentes, é visı́vel
a estrutura em blocos da imagem; quando o número de componentes aumenta este efeito desa-
parece.

4 componentes 8 componentes

16 componentes 32 componentes

17
3.2 Exemplo: Compressão de Imagem 18

Apêndice
function [x,sc]=blkimag(s,n)
%function [x,imag_cut]=blkimag(imag,n)
% imag: matriz de RxC com a imagem
% n: imag dividida em blocos de nxn
% x: matriz de (nˆ2 x numero_de_blocos_na_imagem)
% imag_cut: matriz de (r x c) r=n*round(R/n) e c=n*round(C/n);
[R,C]=size(s);
r=floor(R/n);
c=floor(C/n);
sc=s(1:n*r,1:n*c);
N=r*c;
x=zeros(n*n,N);
for i=1:r
x(:,1+(i-1)*c:i*c)=reshape(sc(1+(i-1)*n:i*n,:),n*n,c);
end

function [s,y]=unblkimag(x,n,r,c)
%function [imag]=unblkimag(x,n,R,C)
% x: blocos da imagem (nˆ2 x numero de blocos na imagem)
% imag: matriz de RxC com a imagem reconstruida
% n: imagem original dividida em blocos de nxn => x
if(sum(size(x)==[n*n,r*c/nˆ2])˜=2)
error(’dimensoes erradas!’)
exit(1)
end
r=r/n;
c=c/n;
for i=1:r
s(1+(i-1)*n:i*n,:)=reshape(x(:,1+(i-1)*c:i*c),n,c*n);
end
y=s;
%quantificar imagem em 256 niveis de cinzento
s=s-min(min(s));
s=uint8(255*s/max(max(s)));

18

Você também pode gostar