Está en la página 1de 10

Laboratorio de Televisin Angee Paola Ballesteros Maldonado Erika Sofa Zutta Garca Jhonattan Leonardo Gantiva Rodrguez 20081005113

20081005024 20081005056

Compresin JPEG para una imagen utilizando muestreo espacial 4:2:0, y cuantificacin con las matrices estndar para luminancia y crominancia, escaladas de acuerdo a Q=80, y bajo el criterio de eliminacin de los 20 coeficientes de ms alta frecuencia de cada bloque para la codificacin RLC.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Guin para efectuar compresin JPEG sobre una imagen % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% a=1; b=1; c=1; d=0; f=1; n=1; g=6; % Carga de imagen en una variable para trabajarla en Matlab im=imread('D:\Jhonattan Leonardo\Downloads\ImagendePrueba.bmp'); %im=imread('D:\Jhonattan Leonardo\Pictures\im\Ajiaco.bmp'); figure(1),subplot(121),imshow(im) imycbcr=(rgb2ycbcr(im)); % Conversin de la imagen en el espacio de color % RGB al espacio YCbCr subplot(122),imshow(imycbcr) v1 = [1 0]; % Vector generador de la matriz de 4:2:0 % Ciclo que forma la matriz que se multiplica por las matrices de % crominancia R y B e = size(imycbcr,1) for i=1:e/2-1 v1 = [1 0 v1]; end w = v1'; y420 = (w*v1); planeY = (imycbcr(:,:,1)); % Plano de Luminancia de la imagen almacenada planeCb = (imycbcr(:,:,2)); % Plano de Crominancia del Azul de la imagen almacenada planeCr = (imycbcr(:,:,3)); % Plano de Crominancia del Rojo de la imagen almacenada figure(2), subplot(311), imshow(planeY) subplot(312), imshow(planeCb) subplot(313), imshow(planeCr) % Es necesario convertir los planos anteriores del formato entero en el que % se encuentran a formato "double", para poder realizar la multiplicacin % de matrices planeYd=double(planeY); planeCbd=double(planeCb); planeCrd=double(planeCr); planeCb420 = y420'.*planeCbd; planeCr420 = y420'.*planeCrd; planeY420 = planeYd; % Con el fin de seguir con el proceso, pasamos los planos muestreados

% espacialmente a formato entero redondeando los elementos de las matrices planeY420=uint8(planeY420); planeCb420=uint8(planeCb420); planeCr420=uint8(planeCr420); % Se visualiza la imagen con muestreo espacial 4:2:0 imycbcr420 = zeros(0,0,0,'uint8'); imycbcr420(:,:,1) = planeY420; imycbcr420(:,:,2) = planeCb420; imycbcr420(:,:,3) = planeCr420; figure(3),subplot(131), imshow(imycbcr(:,:,1)); subplot(132), imshow(imycbcr(:,:,2)); subplot(133), imshow(imycbcr(:,:,3)); figure(4),imshow(imycbcr420); im420 = ycbcr2rgb(imycbcr420); figure(5),imshow(im420) bloque = zeros(0,0,0,'uint8'); p=0; % ndice de la posicin horizontal del bloque dentro de la imagen q=0; % ndice de la posicin vertical del bloque dentro de la imagen N_bloque=1; % ndice del nmero del bloque % Matriz estndar JPEG para la cuantizacin del bloque de Luminancia matrizqy=[16 11 10 16 24 40 51 61 12 12 14 19 26 58 60 55 14 13 16 24 40 57 69 56 14 17 22 29 51 87 80 62 18 22 37 56 68 109 103 77 24 35 55 64 81 104 113 92 49 64 78 87 103 121 120 101 72 92 95 98 112 100 103 99]; % Matriz estndar JPEG para la cuantizacin del bloque de Crominancia matrizqc=[17 18 24 47 99 99 99 99 18 21 26 66 99 99 99 99 24 26 56 99 99 99 99 99 47 66 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99]; while q<e/8 p=0; while p<e/8 a=1; b=1; c=1; d=0; f=1; n=1; g=6; % Ciclo que forma el bloque de 8x8 pixeles for i=1:8, j=1:8; bloque(i,j,:)= imycbcr420(i+p*8,q*8+j,:); end % Distincin de los planos Y, Cb y Cr del bloque bloquey=bloque(:,:,1) bloquecb=bloque(:,:,2) bloquecr=bloque(:,:,3) p=p+1; % Transformada Discreta de Coseno para el bloque, que determina las % componentes frecuenciales en el mismo, para cada plano dctby = dct(bloque(:,:,1)); dctbcr = dct(bloque(:,:,2));

dctbcb = dct(bloque(:,:,3)); %Cuantificacin de acuerdo al estndar JPEG % Q = 8 Q = 80; if Q<50 S = 5000/Q; else S = 200-2*Q; end % Ecuaciones para ajustar las tablas de cuantizacin a as caractersticas % requeridas de cuantificacin mediante Q. mqy = floor((S.*matrizqy+50)./100); mqc = floor((S.*matrizqc+50)./100); % Se divide cada elemento del bloque por el elemento correspondiente en la % tabla de cuantizacin de luminancia y de crominancia, respectivamente. dctbloquey = round(dctby./mqy); dctbloquecr = round(dctbcr./mqc); dctbloquecb = round(dctbcb./mqc); % -----------------------------------------------------------------------%lectura en zigzag de las matrices de y, cr y cb zigzagy=zeros(0);%creacin del vector que guarda la lectura de la matriz dctbloquey en zigzag zigzagcb=zeros(0);%creacin del vector que guarda la lectura de la matriz dctbloquecb en zigzag zigzagcr=zeros(0);%creacin del vector que guarda la lectura de la matriz dctbloquecr en zigzag zigzagy(n)=dctbloquey(a,b);%se asigna al primer termino del vector el valor de la posicion 11 de la matriz dctbloquey zigzagcb(n)=dctbloquecb(a,b);%se asigna al primer termino del vector el valor de la posicion 11 de la matriz dctbloquecb zigzagcr(n)=dctbloquecr(a,b);%se asigna al primer termino del vector el valor de la posicion 11 de la matriz dctbloquecr n=n+1;%aumenta en 1 la posicin del vector while n<=64 %el tamao de los 3 vectores es de 64 para los datos de la matriz de 8x8 if a<=7 && f<8 %limita la lectura ascendente para la posicin 11 a 81 r=mod(f,2);%diferencia lineas pares de impares if r==1%Para el caso impar b=b+1;%aumenta en uno la posicin columna zigzagy(n)=dctbloquey(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquey en la posicin (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecb en la posicin (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecr en la posicin (a,b) donde a:filas b:columnas n=n+1;%aumenta en 1 la posicin del vector while d<f%crea un ciclo que realiza las acciones un nmero de veces igual al nmero de la fila d=d+1;%aumenta la variable que modifica el ciclo a=a+c;%modifica la posicin de la fila aumenta o disminuye en 1 dependiendo si c es 1 o -1 b=b-c;%modifica la posicin de la columna aumenta o disminuye en 1 dependiendo si c es 1 o -1 zigzagy(n)=dctbloquey(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquey en la posicin (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecb en la posicin (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecr en la posicin (a,b) donde a:filas b:columnas n=n+1; %aumenta en 1 la posicin del vector end%fin del ciclo

c=c*-1; %Invierte el valor de c f=f+1;% aumenta el nmero de la fila d=0;%reinicia la variable d else %para el caso par a=a+1;%aumenta en uno la posicin fila zigzagy(n)=dctbloquey(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquey en la posicin (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecb en la posicin (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecr en la posicin (a,b) donde a:filas b:columnas n=n+1;%aumenta en 1 la posicin del vector while d<f %crea un ciclo que realiza las acciones un nmero de veces igual al nmero de la fila d=d+1;%aumenta la variable que modifica el ciclo a=a+c;%modifica la posicin de la fila aumenta o disminuye en 1 dependiendo si c es 1 o -1 b=b-c;%modifica la posicin de la columna aumenta o disminuye en 1 dependiendo si c es 1 o -1 zigzagy(n)=dctbloquey(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquey en la posicin (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecb en la posicin (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecr en la posicin (a,b) donde a:filas b:columnas n=n+1;%aumenta en 1 la posicin del vector end%fin del ciclo c=c*-1;%Invierte el valor de c f=f+1;% aumenta el nmero de la fila d=0;%reinicia la variable d end %fin de la lectura ascendente ha llegado a la posicin 81 de las matrices else %lectura descendente desde la posicin 82 a la posicin 88 r=mod(g,2);% para diferenciar dilas pares de impares if r==0 %para el caso par b=b+1;%aumenta en uno la posicin columna zigzagy(n)=dctbloquey(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquey en la posicin (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecb en la posicin (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecr en la posicin (a,b) donde a:filas b:columnas n=n+1;%aumenta en 1 la posicin del vector while d<g %crea un ciclo que realiza las acciones un nmero de veces igual al nmero de la fila d=d+1;%aumenta la variable que modifica el ciclo a=a+c;%modifica la posicin de la fila aumenta o disminuye en 1 dependiendo si c es 1 o -1 b=b-c;%modifica la posicin de la columna aumenta o disminuye en 1 dependiendo si c es 1 o -1 zigzagy(n)=dctbloquey(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquey en la posicin (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecb en la posicin (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecr en la posicin (a,b) donde a:filas b:columnas n=n+1; %aumenta en 1 la posicin del vector end%fin del ciclo c=c*-1;%Invierte el valor de c g=g-1;%disminuye el nmero de la fila d=0;%reinicia la variable d else %para el caso impar

a=a+1; %aumenta en uno la posicin fila zigzagy(n)=dctbloquey(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquey en la posicin (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecb en la posicin (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecr en la posicin (a,b) donde a:filas b:columnas n=n+1;%aumenta en 1 la posicin del vector while d<g %crea un ciclo que realiza las acciones un nmero de veces igual al nmero de la fila d=d+1;%aumenta la variable que modifica el ciclo a=a+c;%modifica la posicin de la fila aumenta o disminuye en 1 dependiendo si c es 1 o -1 b=b-c;%modifica la posicin de la columna aumenta o disminuye en 1 dependiendo si c es 1 o -1 zigzagy(n)=dctbloquey(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquey en la posicin (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecb en la posicin (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b);%asigna a la posicin n del vector el valor de la matriz dctbloquecr en la posicin (a,b) donde a:filas b:columnas n=n+1;%aumenta en 1 la posicin del vector end%fin del ciclo c=c*-1; %Invierte el valor de c g=g-1; %disminuye el nmero de la fila d=0; %reinicia la variable d end %fin de la lectura descendente llega a la posicin 88 end end %fin de la lectura en zigzag %Discriminacin de umbral = 20; Umb = 20; zigzagy(length(zigzagy)-Umb:length(zigzagy))=0 zigzagcb(length(zigzagcb)-Umb:length(zigzagcb))=0 zigzagcr(length(zigzagcr)-Umb:length(zigzagcr))=0 %RLC %Q=8 %RLC=8 bits; %Encabezado=2 bits; %-------------------------------------------------------------------%codigo zigzag para devolverse %Escritura de las matrices a=1;b=1;c=1;d=0;f=1;n=1;g=6;%Reinicializacin de Variables matrizy = zeros(8,8);%Se crea la matriz de 8x8 para y matrizcr = zeros(8,8);%Se crea la matriz de 8x8 para cr matrizcb = zeros(8,8);%Se crea la matriz de 8x8 para cb matrizy (a,b)= zigzagy(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcr (a,b)= zigzagcr(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcb (a,b)= zigzagcb(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n n=n+1;%aumenta en 1 la posicin del vector while n<=64 %Ciclo de escritura de las tres matrices de 8x8 para un total de 64 elementos if a<=7 && f<8 %limita la escritura desde la posicin 11 a la posicin 81 r=mod(f,2);%diferencia lineas pares de impares if r==1%Para el caso impar b=b+1;%aumenta en uno la posicin columna

matrizy (a,b)= zigzagy(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcr (a,b)= zigzagcr(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcb (a,b)= zigzagcb(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n n=n+1;%aumenta en 1 la posicin del vector while d<f%crea un ciclo que realiza las acciones un nmero de veces igual al nmero de la fila d=d+1;%aumenta la variable que modifica el ciclo a=a+c;%modifica la posicin de la fila aumenta o disminuye en 1 dependiendo si c es 1 o -1 b=b-c;%modifica la posicin de la columna aumenta o disminuye en 1 dependiendo si c es 1 o -1 matrizy (a,b)= zigzagy(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcr (a,b)= zigzagcr(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcb (a,b)= zigzagcb(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n n=n+1; %aumenta en 1 la posicin del vector end%fin del ciclo c=c*-1; %Invierte el valor de c f=f+1;% aumenta el nmero de la fila d=0;%reinicia la variable d else %para el caso par a=a+1;%aumenta en uno la posicin fila matrizy (a,b)= zigzagy(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcr (a,b)= zigzagcr(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcb (a,b)= zigzagcb(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n n=n+1;%aumenta en 1 la posicin del vector while d<f %crea un ciclo que realiza las acciones un nmero de veces igual al nmero de la fila d=d+1;%aumenta la variable que modifica el ciclo a=a+c;%modifica la posicin de la fila aumenta o disminuye en 1 dependiendo si c es 1 o -1 b=b-c;%modifica la posicin de la columna aumenta o disminuye en 1 dependiendo si c es 1 o -1 matrizy (a,b)= zigzagy(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcr (a,b)= zigzagcr(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcb (a,b)= zigzagcb(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n n=n+1;%aumenta en 1 la posicin del vector end%fin del ciclo c=c*-1;%Invierte el valor de c f=f+1;% aumenta el nmero de la fila d=0;%reinicia la variable d end %fin de la escritura ascendente ha llegado a la posicin 81 de las matrices else %escritura desde la posicin 82 a la posicin 88 r=mod(g,2);% para diferenciar dilas pares de impares if r==0 %para el caso par b=b+1;%aumenta en uno la posicin columna matrizy (a,b)= zigzagy(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n

matrizcr (a,b)= zigzagcr(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcb (a,b)= zigzagcb(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n n=n+1;%aumenta en 1 la posicin del vector while d<g %crea un ciclo que realiza las acciones un nmero de veces igual al nmero de la fila d=d+1;%aumenta la variable que modifica el ciclo a=a+c;%modifica la posicin de la fila aumenta o disminuye en 1 dependiendo si c es 1 o -1 b=b-c;%modifica la posicin de la columna aumenta o disminuye en 1 dependiendo si c es 1 o -1 matrizy (a,b)= zigzagy(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcr (a,b)= zigzagcr(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcb (a,b)= zigzagcb(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n n=n+1; %aumenta en 1 la posicin del vector end%fin del ciclo c=c*-1;%Invierte el valor de c g=g-1;%disminuye el nmero de la fila d=0;%reinicia la variable d else %para el caso impar a=a+1; %aumenta en uno la posicin fila matrizy (a,b)= zigzagy(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcr (a,b)= zigzagcr(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcb (a,b)= zigzagcb(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n n=n+1;%aumenta en 1 la posicin del vector while d<g %crea un ciclo que realiza las acciones un nmero de veces igual al nmero de la fila d=d+1;%aumenta la variable que modifica el ciclo a=a+c;%modifica la posicin de la fila aumenta o disminuye en 1 dependiendo si c es 1 o -1 b=b-c;%modifica la posicin de la columna aumenta o disminuye en 1 dependiendo si c es 1 o -1 matrizy (a,b)= zigzagy(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcr (a,b)= zigzagcr(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n matrizcb (a,b)= zigzagcb(n);%se asigna a la posicin a,b de la matriz el valor del vector en la posicin n n=n+1;%aumenta en 1 la posicin del vector end%fin del ciclo c=c*-1; %Invierte el valor de c g=g-1; %disminuye el nmero de la fila d=0; %reinicia la variable d end %fin de la escritura llega a la posicin 88 end %-----------------------------------------------------------------------% Multiplicacin del bloque en sus componentes obtenido por las tabals de % cuantificacin de Luminancia o de Crominancia, segn el caso, para % recuperar la informacin de la imagen mzy = matrizy.*mqy; mzcr = matrizcr.*mqc; mzcb = matrizcb.*mqc; % Se halla la transformada discreta inversa de coseno a cada bloque

bloquerecy = idct(mzy); bloquereccb = idct(mzcr); bloquereccr = idct(mzcb); end %fin de la escritura de matrices N_bloque = N_bloque+1 % Reconstruccin de la informacin de la imagen a partir de los bloques, % para cada componente imagrecy(8*p+1:8*p+8,8*q+1:8*q+8)= bloquerecy; imagreccb(8*p+1:8*p+8,8*q+1:8*q+8)= bloquereccb; imagreccr(8*p+1:8*p+8,8*q+1:8*q+8)= bloquereccr; end q=q+1; end imagrec=zeros(0,0,0,'uint8'); % Recuperacin de la imagen a partir de los tres planos que la conforman en % el espacio de color YCbCr imagrec(:,:,1)=imagrecy; imagrec(:,:,2)=imagreccb; imagrec(:,:,3)=imagreccr; imagrec=imagrec(9:e+8,1:e,:); figure, imshow(imagrec) % Conversin de la imagen recuperada al espacio de color RGB imrecrgb = ycbcr2rgb(imagrec); figure, imshow(imrecrgb)

Se obtienen las siguientes imgenes:

Fig. 1. Comparacin de la imagen original en RGB con su equivalente imagen en YCbCr.

Fig. 2. Observacin separada de los planos Y, Cb, Cr de la imagen original, antes del muestreo.

Fig. 3. Observacin separada de los planos Y, Cb, Cr de la imagen original, despus del muestreo 4:2:0.

Fig. 4. Muestreo Espacial 4:2:0 de la imagen en el espacio de color YCbCr.

Fig. 5. Imagen recuperada en el espacio de color YCbCr despus del proceso completo de compresin.

También podría gustarte