Está en la página 1de 13

Universidad Politcnica de Madrid

Mster en tratamiento Estadstico-computacional de la


informacin
TRABAJO FIN DE CURSO
Mtodos tiempo-frecuencia e imgenes
(Compresin de imgenes ejemplo ilustrativo-)

Profesor: FRANCISCO BALLESTEROS OLMO


francisco.ballesteros@upm.es
Alumno: Amine Assabah
amine.assabah@alumnos@upm.es

1-Introduccin:
En nuestros das, las imgenes numricas tienen influencia en la vida actual, podemos citar
por ejemplo la fotografa numrica, web, imgenes medcales. Sus utilizaciones en forma
bruta cambia sus probabilidades difciles (tiempo de transmisin alto) y sus
almacenamientos incomodo (necesita ms memoria), por eso la gente han buscado muchas
nuevas tcnicas, en nuestro trabajo vamos a estudias compresin y codificacin de imagen.

2-definicion del mtodo de compresin


La Compresin de la imagen es un mtodo para reducir los datos redundantes y irrelevantes
de la imagen con la menor prdida posible, la compresin de imagen puede ser con prdida
o sin perdida.
La compresin de los datos o el codificacin permite (aplicando los algoritmos de
compresin especifica) de reducir el tamao de imagen en un memoria o de manera
equivalente de reducir su tiempo de transmisin.
Vamos a ilustrar un dibujo que nos da una idea sobre el sistema de compresin de las
imgenes:

Imagen Original
(, )

Compresin

Descompresin

(, )

Lnea de transmisin
Memorizar

Pedir
Memoria

Figura 1: principio de compresin de imagen

3-los tipos de Compresin:

a-Compresin sin prdida:


La cualidad de las imgenes despus de la compresin es la misma que la imagen original.
La tasa de compresin en este tipo es lmite.

Este tipo de compresin podemos encontrarlo en las temas de mayor precisin como
imgenes medcales (IRM por ejemplo) o teledeteccin (Imagen de satlite etc...).Los
algoritmos de compresin empleadas son muchas, las ms importantes son:
a-Codificacin de Estructuras repetitivas: por ejemplo RLC (Run Length Coding)
B-Codificacin entrpica: Basado en la codificacin de VLC (variable Length Coding), por
ejemplo codificacin de Huffman, codificacin aritmtico, ect..
c-Codificacin diccionario o codificacin Lempel-Ziv-Welch (LZW):
En este codificacin no hace falta saber las probabilidades de las smbolos al revese de
codificacin entrpica.
b-Compresin con prdida:
Es un compresin destructiva, permite un sacrificio de algunas detallas no recuperables en
descompresin al beneficio de reduccin de peso. Esta degradacin puede ser controlado
segn la cualidad que lo queremos conseguir en funcin de tasa de compresin elegida.
Este tipo de compresin, lo encontramos generalmente en las reas normales practica,
donde la reduccin del peso de las imgenes es muy importante, por ejemplo en rea de
multimedia (web, fotografa) donde la fidelidad a imagen original no es importante y la tasa
de compresin ser ms grande que la tasa de compresin sin perdida, es decir que hay un
lmite a la cualidad que lo queremos conseguir.
Hay muchas Los algoritmos de la compresin empleada, el ms utilizada es: la codificacin
por transformacin
Este tipo de codificacin llama a las transformaciones matemticas para obtener una
cartografa de las frecuencias espacial en imagen.
La transformacin de coseno discreta DCT y la transformada de ondicula son las ms
utilizadas.

4-Los pasos de la compresin por transformacin:


Esta figura representa la compresin clsica:

Imagen
Original

Codificar
Transformacin

Cuantificacin

Codificacin
Binario

Figura 2: Esquema de un sistema de compresin con la mtodo de transformacin

1-Transformacion:
La transformacin nos da la posibilidad de minimizar las redundancias estadsticas de
imgenes y concentrar la informacin pertinente en un pequeo nombre de coeficientes
significativos, todo esto para permitir una atribucin de bits en estos coeficientes en la fase
de cuantificacin y codificacin. Este fase es reversible y prcticamente sin perder.
2-Cuantificacion:
Es la fase nica no reversible en el esquema de compresin. En muchas aplicaciones de
compresin con prdidas, hemos hecho una representacin de seales por pequeo nmero
de palabras de codificacin. De manera general el numero de valores distintos posibles de
seal es ms grande que el numero de palabras de codificacin disponibles.
La cuantificacin puede ser vectorial o escalar, la cuantificacin vectorial permite de
cuantificar conjuntamente muchos coeficientes. La cuantificacin escalar es menos compleja
y ms eficaz si procedemos por una transformacin adaptado a las caractersticas de imagen.
3-Codificacion entrpica:
Nos da la posibilidad de la compresin de las coeficientes cuantificados y generando un tren
binario de longitud cerca de la limite terica definida en el entropa de Shannon.
Hay muchas tipos de codificacin por la compresin de imgenes como la codificacin por
estadstica (Huffman), codificacin diccionario.

TRANSFORMADA DISCRETA DEL COSENO (DCT)


La transformada discreta del coseno (DCT), - tambin denominada transformada del coseno
-, es la ms ampliamente utilizada en compresin de imgenes.
Esta transformada cuenta con una buena propiedad de compactacin de energa y es muy
similar a la KLT Karhunen-Love Transform), que produce coeficientes incorrelados, con la
diferencia de que los vectores base de la DCT dependen slo del orden de la transformada
seleccionado, y no de las propiedades estadsticas de los datos de entrada.
La decorrelacin de coeficientes es muy importante para compresin, ya que, el posterior
tratamiento de cada coeficiente se puede realizar de forma independiente, sin prdida de
eficiencia de compresin. Otro aspecto importante de la DCT es la capacidad de cuantificar
los coeficientes utilizando valores de cuantificacin que se eligen de forma visual. Esta
transformada ha tenido una gran aceptacin dentro el tratamiento digital de imagen, debido
al hecho de que, para los datos de una imagen convencional, que tienen una alta correlacin
entre elementos, su comportamiento es virtualmente indistinguible de la KLT (caso ms
ptimo).

La DCT est bastante relacionada con la DFT , con la diferencia de que es una transformada
real, debido a que los vectores base se componen exclusivamente de funciones coseno
muestreadas. Adems la DCT minimiza algunos de los problemas que surgen con la aplicacin de la
DFT a series de datos, como veremos ms adelante.

Un Ejemplo ilustrativo:
Imagen del ejemplo:

Los resultados de una compresin de un imagen a un nivel de gris 8bit 232x256 pixels y de un
formato BMP (voluminosa) y de tamao 59392 bits:
Imagen Original

DCT

Tamao de la imagen original: 59392 bits


Tamao de imagen comprimida: 47453 bits
bpp:0.7990

EQM es la media de la evaluacin del error cuadrtica

imagen comprimida

tasa de compresin: 1.2516


EQM: 256932 PSNR: 34.0326

Bpp: bits por pixeles


PSNR: La Relacin Seal a Ruido de Pico o PSNR (del ingls Peak Signal-to-Noise Ratio).

Observamos que la tamao de imagen comprimida con la tasa de compresin igual a 1.25,lo que es
aceptable ,pero hemos podido conseguir mejores resultados si cogemos una imagen mas corralada
de la nuestra. Observamos tambin que el DCT en cada sub-bloques hace una concentracin de las
coeficientes (en blanco).
El imagen no ha perdido su fidelidad, esto se parece con una visin normal de la imagen, pero
cuando leemos los estadsticos, vimos que el error cuadrtica no es nula, e igual a EQM=25.69 ,esto
significa que hay un error con un diferencia media de 25.7 entre las elementos de dos matrices
imagen, pero es notable solamente en el escala de sub bloque 8x8,donde podemos observar la
diferencia en esta figure :
Sub bloque de imagen original

sub bloque de imagen comprimida

Hay algunas pixel que no son las mismas en las dos sub bloque y no tienen el mismo nivel de gris,
esto significa que el paso de cuantificacin es un paso con prdidas.
El PSNR igual a 34 db que es aceptable, lo que muestre una compresin eficaz en el tema de
tamao/cualidad. El nmero de bit por pixel ha reducido de 0.799, por eso hemos perdido el peso del
fichero de imagen. Si queremos ir ms lejos, podemos aadir esta funcin que genera otras tablas de
cuantificacin en funcin de FQ:
function quantizer = cuantificador (FQ,dim_bloc)
for i=1:dim_bloc
for j=1:dim_bloc
quantizer(i,j) = 1 + ((1 + i + j)*FQ);
end
end

Obtenemos los siguientes resultados:

por: FQ = 10
tamao _imagen comprimida =20820bits
tasa de compresin = 2.8526
EQM = 65.7042 PSNR = 29.9549 dB bpp = 0.3506

por: FQ = 50
tamao _imagen comprimida =8978bits
tasa de compresin = 6.6153
EQM = 240.4954 PSNR = 24.3197 dB bpp = 0.1512

por: FQ = 100(maximo)
tamao _imagen comprimida =7716bits
tasa de compresin = 7.6973
EQM = 435.2725 PSNR = 21.4732 dB bpp = 0.1299

Observamos que cuando elegimos un factor de cualidad ms grande, la tasa de compresin ser
mejor, pero EQM aumenta lo que influye sobre la eficacia de la compresin que lo podemos
observar de manera visual y tambin el numero dbil de PSNR , porque hemos perdido muchos
datos durante el paso de cuantificacin, y esto llega a ser muy visible, y el imagen se transforma a
un imagen factible en algunas limites.

Cdigo de Matlab utilizado:


El cdigo est formado de cuatro scripts:
--------------script de inicio------------------clear
img_originale = double(imread('C:\Users\AMINE\Desktop\mi.jpg'));
dim_bloc = 8; %dimensin 8x8 de sub bloc
init_jpeg; % declaracin de variables necesarios (ver:
init_jpeg.m)
%codificacin y descompresin (ver codage_jpeg.m)
codage_jpeg
%descodificacin y descompresin (ver decodage_jpeg.m)
decodage_jpeg
%mostrar imagen original y DCT; imagen descomprimida.
figure(1)
subplot(1,3,1)
imshow(uint8(img_originale))
title('Imagen Original');
subplot(1,3,2)
imshow(jpeg)
title('DCT');
subplot(1,3,3)
imshow(uint8(img_decompresse))
title('Imagen descomprimida');
figure(2)
subplot(2,2,1)
imshow(uint8(img_originale(112:120,120:128)))
title(sub bloque de imagen original');
subplot(2,2,2)
imshow(uint8(img_decompresse(112:120,120:128)))
title(sub bloque de imagen original');
%Evaluacin de tasa de compresin
for i=1:8:m
for j=1:8:n
eval([ sprintf('tamao imagen original= tamao imagen comprimida +
numel(hcode_%d_%d);',i ,j)]);
end
end
tamao original = dim_img
tamao _img_compresser
tasa compresin = tamao _original / tamao _img_compresser
%Evaluacin del error cuadrtica media EQM
somme=0;
for(i=1:m)
for(j=1:n)

somme=somme + ((img_originale(i,j) - img_decompresse(i,j))^2);


end
end
EQM=somme/(m*n)
%CALCULAR PSNR
bit=8;
PSNR=10*log10(((2^bit-1)^2)/EQM)
%Calcular bits por pixel Bpp.
bpp = tamao _img_compresser / dim_img

------------------init_jpeg.m--------------------------------% Declaracin de las variables et inicializacin de las constantes


jpeg = ones(size(img_originale)); % Matriz JPEG donde tenemos matriz
comprimida
jpeg_deco = ones(size(jpeg)); % Matriz donde tenemos imagen descomprimida
offset = ones(dim_bloc,dim_bloc)*128; %Matriz 8x8 por "Level Shifting".
DCT = dctmtx(dim_bloc); % Matriz C para el clculo de F
% recuperacin de las dimensiones de imagen.
[m,n] = size(img_originale);
dim_img = m*n;
%Matriz o tabla de cuantificacin Q (Standard JPEG)
quantizer =...
[...
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 ... ];
%Vector de scan
zigzag = ones([1 dim_img]);
%Funcin de recuperacin de los ndices de scan zigzag (ver
init_indices_zigzag.m)
[col lig] = init_indices_zigzag(dim_bloc);
%Vector du codificacin/decodificacin RLE y codificacin /decodificacin
Huffman
rle = [];
rle_deco = [];
huff_deco = [];
% Constantes tiles
taux_compression = 0;
taille_img_compresser = 0;
dec_l = 0;
dec_c = 0;
redondance = 0;
col_rle_p = 1;
k = 1;
z =1;
d=0;

--------------------init_indices_zigzag.m------------------------------%este funcion permite de crear dos matrices, matriz lnea lig y matriz
%columna col
%Cada matrices tiene ndices lneas y columnas que van a ayudar para hacer
%scan zigzag por un sub bloque 8x8
function [col,lig]=init_indices_zigzag(dim_bloc)
col = ones([1 (dim_bloc * dim_bloc)]);
lig = ones([1 (dim_bloc * dim_bloc)]);
lig(1) = 1;
k=2;
r=1;
for x=3:2:dim_bloc
for j=1:x
lig(k) = j;
k = k + 1;
end
for j=x-1:-1:1
lig(k) = j;
k = k + 1;
end
for j=1:x-1
col(r) = j;
r = r + 1;
end
for j=x-2:-1:1
col(r) = j;
r = r + 1;
end
if(x == 7 ),
x = x+1;
for j=1:x
lig(k) = j;
k = k + 1;
col(r) = j;
r = r + 1;
end
for j=x-1:-1:1
col(r) = j;
r = r + 1;
end
for z=2:2:x
for j=x:-1:z+1
lig(k) = j;
k = k + 1;
end
for j=z:x
lig(k) = j;
k = k + 1;
end
for j=z:x
col(r) = j;
r = r + 1;
end
if(z ~= dim_bloc)
for j=x:-1:z+1
col(r) = j;
r = r + 1;
end

end
end
end
end;

-------------------codage_jpeg.m--------------------------%Bucle general DONDE va a estar el imagen en sub bloc 8x8


for i=1:dim_bloc:m
dec_l = i-1; %desplazamiento vertical de sub blocs
for j=1:dim_bloc:n
dec_c = j-1; %Desplazamiento vertical de sub blocs
jpeg(i:i+7,j:j+7) = img_originale(i:i+7,j:j+7) - offset; %
jpeg(i:i+7,j:j+7) = DCT * jpeg(i:i+7,j:j+7) * DCT'; % Aplicar DCT
(cf.[7]).
jpeg(i:i+7,j:j+7) = jpeg(i:i+7,j:j+7) ./ quantizer; % Divisin por la tabla
Q.
jpeg(i:i+7,j:j+7) = round(jpeg(i:i+7,j:j+7));
for q =1:64
zigzag(k) = jpeg(lig(q)+dec_l,col(q)+dec_c); % hacer un scan
ZigZag.
k = k + 1;
end
d = k - 64;
q = 1;
while(q <= 64) % Boucle While que hace un codificacin RLC por cada
sub bloc
if (d < dim_img) && (zigzag(d) ~= zigzag(d+1))
rle(z) = zigzag(d);
d = d + 1;
q = q + 1;
z = z + 1;
elseif (d < dim_img) && (zigzag(d) == zigzag(d+1)) &&
(zigzag(d+1) ~= zigzag(d+2))
rle(z) = zigzag(d);
rle(z+1) = zigzag(d+1);
d = d + 2;
q = q + 2;
z = z + 2;
elseif (d < dim_img) && (zigzag(d) == zigzag(d+1)) &&
(zigzag(d+1) == zigzag(d+2))&& (zigzag(d+2) ~= zigzag(d+3))
rle(z) = zigzag(d);
rle(z+1) = zigzag(d+1);
rle(z+2) = zigzag(d+2);
d = d + 3;
q = q + 3;
z = z + 3;
elseif (d < dim_img) && (zigzag(d) == zigzag(d+1)) &&
(zigzag(d+1) == zigzag(d+2))&& (zigzag(d+2) == zigzag(d+3))
redondance = 4;
rle(z) = 257;
rle(z+1) = redondance;
rle(z+2) = zigzag(d);
d = d + 3;
q = q + 4;
while (q <= 64) && (d < dim_img) && (zigzag(d) == zigzag(d+1))
redondance = redondance + 1;
q = q + 1;

d = d + 1;
end
rle(z+1) = redondance;
d = d + 1;
z = z + 3;
end
if(q == 64)
q = q+1;
end
end
% inicio de codificacin Entrpica de Huffman.
col_rle = z-1;
%Extraccin de los simboles nicos presentados en el vector
%RLC.
symboles = unique(rle(col_rle_p:col_rle));
nbr_symboles = numel(symboles);
taille_block = numel(rle(col_rle_p:col_rle));
%Calcular las probabilidades por cada simboles.
table_p = ones(1,nbr_symboles);
for q = 1:nbr_symboles
itter = 0;
for r = col_rle_p:col_rle
if(rle(r) == symboles(q))
itter = itter + 1;
end
end
table_p(q) = itter / taille_block;
end
%arbol de Huffeman
eval([ sprintf('dico_%d_%d = huffmandict(symboles,table_p);', i ,j)]);
eval([ sprintf('hcode_%d_%d =
huffmanenco(rle(col_rle_p:col_rle),dico_%d_%d);', i ,j,i
,j)]);
col_rle_p = col_rle+1;
end
end

-----------------------decodage_jpeg.m------------------------------------%decodificacin Huffman
for i=1:dim_bloc:m
for j=1:dim_bloc:n
eval([ sprintf('huff_deco = [huff_deco
huffmandeco(hcode_%d_%d,dico_%d_%d)];', i
,j,i ,j)]);
end
end
%Decodificacin RLE
i = 1;
k = 1;
while(k <= numel(huff_deco))
if(huff_deco(k) == 257)
rle_deco(i:(i-1+huff_deco(k+1))) = huff_deco(k+2);
i = i + huff_deco(k+1);
k = k +3;
else
rle_deco(i) = huff_deco(k);
i = i +1;
k = k +1;

end
end
k=1;
for i=1:dim_bloc:m
dec_l = i-1;
for j=1:dim_bloc:n
dec_c = j-1;
%Scan zigzag inverso
for q =1:64
img_decompresse(lig(q)+dec_l,col(q)+dec_c) = rle_deco(k);
k = k + 1;
end
%cuantificacin inversa + IDCT + (Inverse
%Level Shifting)
img_decompresse(i:i+7,j:j+7) = img_decompresse(i:i+7,j:j+7) .* quantizer;
img_decompresse(i:i+7,j:j+7) = DCT' * img_decompresse(i:i+7,j:j+7) * DCT;
img_decompresse(i:i+7,j:j+7) = img_decompresse(i:i+7,j:j+7) + offset;
end