tfc[tiempo frecuencia]

13
Universidad Politécnica de Madrid Máster en tratamiento Estadístico-computacional de la información TRABAJO FIN DE CURSO Métodos tiempo-frecuencia e imágenes (Compresión de imágenes –ejemplo ilustrativo-) Profesor: FRANCISCO BALLESTEROS OLMO [email protected] Alumno: Amine Assabah amine.assabah@[email protected]

Upload: aminesunderland

Post on 16-Sep-2015

228 views

Category:

Documents


0 download

DESCRIPTION

compresion DCT

TRANSCRIPT

  • 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

    [email protected]

    Alumno: Amine Assabah

    amine.assabah@[email protected]

  • 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

    (, )

    Lnea de transmisin (, )

    Memorizar Pedir

    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.

    Compresin Descompresin

    Memoria

  • 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:

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

    Imagen

    Original

    Transformacin Cuantificacin Codificacin Codificar

    Binario

  • 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 imagen comprimida

    Tamao de la imagen original: 59392 bits tasa de compresin: 1.2516

    Tamao de imagen comprimida: 47453 bits EQM: 256932 PSNR: 34.0326

    bpp:0.7990

    EQM es la media de la evaluacin del error cuadrtica

  • 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

  • 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

  • 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