Laboratorio de Televisión
Angee Paola Ballesteros Maldonado
20081005113
Erika Sofía Zutta García
20081005024
Jhonattan Leonardo Gantiva Rodríguez
20081005056
Compresión JPEG para una imagen utilizando muestreo espacial 4:2:0, y cuantificación con las matrices estándar para luminancia y crominancia, escaladas de acuerdo a Q=80, y bajo el criterio de eliminación de los 20 coeficientes de más alta frecuencia de cada bloque para la codificación RLC.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Guión para efectuar compresión 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)); % Conversión 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)); (imycbcr(:,:,2)); % Plano de Crominancia del Azul de la imagen almacenada planeCr = (imycbcr(:,:,3)); (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 multiplicación % 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 posición horizontal del bloque dentro de la imagen q=0; % Índice de la posición vertical del bloque dentro de la imagen N_bloque=1; % índice del número del bloque % Matriz estándar JPEG para la cuantización 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 estándar JPEG para la cuantización 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
dctbcb = dct(bloque(:,:,3)); %Cuantificación de acuerdo al estándar JPEG % Q = 8 Q = 80; if Q<50 S = 5000/Q; else S = 200-2*Q; end % Ecuaciones para ajustar las tablas de cuantización a ñas características % requeridas de cuantificación 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 cuantización 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); %creación del vector que guarda la lectura de la matriz dctbloquey en zigzag zigzagcb=zeros(0); %creación del vector que guarda la lectura de la matriz dctbloquecb en zigzag zigzagcr=zeros(0); %creación 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 posición del vector while n<=64 %el tamaño 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 posición 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 posición columna zigzagy(n)=dctbloquey(a,b); %asigna a la posición n del vector el valor de la matriz dctbloquey en la posición (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b); %asigna a la posición n del vector el valor de la matriz dctbloquecb en la posición (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b); %asigna a la posición n del vector el valor de la matriz dctbloquecr en la posición (a,b) donde a:filas b:columnas n=n+1;%aumenta en 1 la posición del vector while d
c=c*-1; %Invierte el valor de c f=f+1;% aumenta el número de la fila d=0;%reinicia la variable d else %para el caso par a=a+1;%aumenta en uno la posición fila zigzagy(n)=dctbloquey(a,b); %asigna a la posición n del vector el valor de la matriz dctbloquey en la posición (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b); %asigna a la posición n del vector el valor de la matriz dctbloquecb en la posición (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b); %asigna a la posición n del vector el valor de la matriz dctbloquecr en la posición (a,b) donde a:filas b:columnas n=n+1;%aumenta en 1 la posición del vector while d
a=a+1; %aumenta en uno la posición fila zigzagy(n)=dctbloquey(a,b); %asigna a la posición n del vector el valor de la matriz dctbloquey en la posición (a,b) donde a:filas b:columnas zigzagcb(n)=dctbloquecb(a,b); %asigna a la posición n del vector el valor de la matriz dctbloquecb en la posición (a,b) donde a:filas b:columnas zigzagcr(n)=dctbloquecr(a,b); %asigna a la posición n del vector el valor de la matriz dctbloquecr en la posición (a,b) donde a:filas b:columnas n=n+1;%aumenta en 1 la posición del vector while d
matrizy (a,b)= zigzagy(n);%se asigna a la posición a,b de la matriz el valor del vector en la posición n matrizcr (a,b)= zigzagcr(n); %se asigna a la posición a,b de la matriz el valor del vector en la posición n matrizcb (a,b)= zigzagcb(n); %se asigna a la posición a,b de la matriz el valor del vector en la posición n n=n+1;%aumenta en 1 la posición del vector while d
matrizcr (a,b)= zigzagcr(n); %se asigna a la posición a,b de la matriz el valor del vector en la posición n matrizcb (a,b)= zigzagcb(n); %se asigna a la posición a,b de la matriz el valor del vector en la posición n n=n+1;%aumenta en 1 la posición del vector while d
bloquerecy = idct(mzy); bloquereccb = idct(mzcr); bloquereccr = idct(mzcb); end %fin de la escritura de matrices N_bloque = N_bloque+1 % Reconstrucción de la información 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'); % Recuperación 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) % Conversión de la imagen recuperada al espacio de color RGB imrecrgb = ycbcr2rgb(imagrec); figure, imshow(imrecrgb)
Se obtienen las siguientes imágenes:
Fig. 1. Comparación de la imagen original en RGB con su equivalente imagen en YCbCr.
Fig. 2. Observación separada de los planos Y, Cb, Cr de l a imagen original, antes del muestreo.
Fig. 3. Observación separada de los planos Y, Cb, Cr de la imagen original, después 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 después del proceso completo de compresión.