Implementamos svd_img
de forma a receber 2 parâmetros: uma "matriz RGB" A
, isto é uma matriz r
para o posto da matriz que a função retorna.
A função quebra a matriz RGB em seus três "canais" (cores) e aplica a decomposição SVD em cada uma dessas matrizes S
no código) até que restem apenas r
valores singulares em sua diagonal
As dimensões de U
e V
também são ajustadas e o produto r
que serve de aproximação para o canal em questão.
Aplicando este processo para a matriz que representa cada cor e concatenando seus resultados, obtemos uma nova matriz RGB que representa a mesma imagem de A
com apenas r
vetores singulares.
Não, não a linguagem de programação Java, mas a buldogue mais fofa que você vai ver. A foto da Java não é de muita qualidade e apresenta posto 719. Ao rodar o script main.m
produzimos 5 images com postos significativamente menores do que a original. Notamos que:
-
Com posto 1 não é possível identificar nada.
-
Com posto 21 e 51, porém, já é possível identificá-la, ainda que muito pixelada.
-
As imagens de posto 101 e 151 apresentam melhorias nos detalhes da fotografia, ficando mais nítidas que a anterior.
-
Com posto 201 é possível considerar que a imagem está recuperada.
O número 201 foi obtido via trial and error e não carrega um resultado teórico para sua escolha - porém poderíamos avaliar a contribuição de cada valor singular para a formação da imagem (leitura externa indica que r
, se existir.
Para obter os mesmos resultados, basta rodar, da raiz do projeto e dentro do octave CLI, main
.