Descomposición en Valores Singulares: Códigos en Matlab

Los códigos que aparecen a continuación están escritos en MATLAB, un lenguaje de programación de alto nivel. Ambos generan imágenes de aproximación tomando p valores singulares. (Puede consultarse Descomposición en Valores Singulares: Compresión de Imágenes para obtener más detalles.) El valor de p aparece como el argumento de entrada de ambas funciones.

El primer código genera imágenes en blanco y negro (y requiere por tanto una imagen en escala de grises con un único canal de color) y el segundo genera imágenes en color (requiere en este caso una imagen con tres canales de color en formato RGB). Estos códigos han sido utilizados para obtener las imágenes que aparecen publicadas en Interacción y en  Imágenes SVD, tomando en todos los casos p=1, es decir, obteniendo siempre aproximaciones de rango uno que, si bien son las peores aproximaciones de entre las que pueden obtenerse con esta técnica, son sin embargo las que más me gustan desde el punto de vista artístico y estético.

  • Para imágenes en blanco y negro:
function svd_BW(p)
A=imread('name_of_image.jpg','jpg');                         
A=double(A); 
[m,n]=size(A);
if p>min(m,n)
    disp('Error: Choose p <= min{m,n}')
    return
end
[U,S,V]=svd(A);
B=U(:,1:p)*S(1:p,1:p)*V(:,1:p)';
imagesc(B),colormap(gray),shg,axis off
end

 

  • Para imágenes en color:
function svd_color(p)
A=imread('name_of_image.jpg','jpg');                                      
A=double(A);
[m,n]=size(A);
if p>min(m,n)
    disp('Error: Choose p <= min{m,n}')
    return
end
[U1,S1,V1]=svd(A(:,:,1));
[U2,S2,V2]=svd(A(:,:,2));
[U3,S3,V3]=svd(A(:,:,3));
B(:,:,1)=U1(:,1:p)*S1(1:p,1:p)*V1(:,1:p)';
a1=min(min(B(:,:,1)));b1=max(max(B(:,:,1)));
B(:,:,1)=(B(:,:,1)-a1)/(b1-a1);
B(:,:,2)=U2(:,1:p)*S2(1:p,1:p)*V2(:,1:p)';
a2=min(min(B(:,:,2)));b2=max(max(B(:,:,2)));
B(:,:,2)=(B(:,:,2)-a2)/(b2-a2);
B(:,:,3)=U3(:,1:p)*S3(1:p,1:p)*V3(:,1:p)';
a3=min(min(B(:,:,3)));b3=max(max(B(:,:,3)));
B(:,:,3)=(B(:,:,3)-a3)/(b3-a3);
imagesc(B),shg,axis off
end

Leave a Reply