domingo, 6 de noviembre de 2011

Leer tablas decodificador

Estos mismos parámetros se usan para las AC de Y ,Cb,Cr
function [exito,run,categoria] = descifrarParametros(palabra)
global tablas;
global tipo;
global contadorPixelBloque;
global codeWordACY ;
global codeWordACC ;
global codeWordDCY ;
global codeWordDCC ;
exito = 0;
if contadorPixelBloque==1;
tipo='AC';
else
tipo='DC';
end

%%% Aqui lee las tablas
 if strcmp(tipo,'DC')
run=0;

     indices = [];
   
     if strcmp(tablas,'luminancia')
     for i=1:16
       buscar=findstr(codeWordDCY (i), sprintf('%09d', palabra));
        if ~isempty (buscar)
           
            run=0;
            categoria=i;
            indices=categoria;
        end
     end
   
  contadorPixelBloque = contadorPixelBloque + 1;
elseif strcmp(tipo,'AC')
 
        elseif strcmp(tablas,'crominancias')
         for i=1:16
        buscar=findstr(codeWordDCC(i), sprintf('%011d', palabra));
        if ~isempty (buscar)
           
            run=0;
            categoria=i;
            indices=categoria;
           
        end
       
        end
        end

funcion para decodificar la imagen

Como se indico se usan las mismas tablas que se usaron para la codificación.


 function [AlturaImagen,AnchoImagen,Imagen_CodY_zigzag_linea,Imagen_CodCB_zigzag_linea,Imagen_CodCR_zigzag_linea] = leerArchivo(pathCompleto)

 fid = fopen(pathCompleto,'r');



%Guardo la altura y el ancho de la imagen


AlturaImagen = fread(fid,1,'uint16');  
AnchoImagen = fread(fid,1,'uint16') ;

%Función para la codificación:



function datosLineales = decodificarHuffmanRLE(fid);
categoria=0;
datosLineales=[];
palabra=[];
banderaLecturaNum=1;
while ~feof(fid)
 byte=fread(fid,1,'uint16');
    bits= sprintf('%016d', dec2bin(byte));
%bitsAC=bitget(uint16(abs(numsAC(i))),8:-1:1);
for i=1:16
        palabra = [palabra bits(i)]; %#ok
if banderaLecturaNum==0 && numel(palabra)>2
[exito,run,categoria]=descifrarParametros(palabra);
if categoria>0 && exito==1
banderaLecturaNum=1;
palabra=[];
end
if categoria == 0 && exito==1
datosLineales=[datosLineales formarLineaDecodificada(run,categoria,0)]; %#ok
end
elseif banderaLecturaNum==1 && numel(palabra)==categoria
datosLineales=[datosLineales formarLineaDecodificada(run,categoria,palabra)]; %#ok
banderaLecturaNum=0;
palabra=[];
end
end
end

viernes, 4 de noviembre de 2011

Funciones para codificación Huffman de las luminancias DC

Function escribirArchivo(pathCompleto,filas,columnas,datosSerializadosY,
datosSerializadosCb,datosSerializadosCr)

%Abrimos la imagen procesada
fid = fopen(pathCompleto,'w+');

%asiganmos variables
PIXELESY = filas;
PIXELESX = columnas;

%creamos una matriz de pixeles x e y
cabecera = [PIXELESY;PIXELESX];
fwrite(fid,cabecera,'uint16');

%Codifica la matriz de Luminancias
escribirHuffmanRLEY(datosSerializadosY,fid);
escribirHuffmanRLEC(datosSerializadosCb,fid);
escribirHuffmanRLEC(datosSerializadosCr,fid);
fclose(fid)


function escribirHuffmanRLEY(datosSerializadosY,fid)
bloques=numel(datosSerializadosY)/64;
for i=1:bloques
    % Codifica y escribe el DC de Luminancia
    palabra16bits=buffer(codificarHuffmanRLEDCY(datosSerializadosY(i*64-63)));
    if numel(palabra16bits) > 0; escribirBytes(palabra16bits,fid); end
end

function palabras16bits = codificarHuffmanRLEDCY(numDC)
negativo=numDC<0;
bitsDC=bitget(uint8(abs(numDC)),8:-1:1);
unos=find(bitsDC);
if numel(unos)>0
    categoria=9-unos(1);
else
    categoria=0;
end
palabras16bits = colocarBits(codeWordDCY(categoria + 1),longDCY(categoria + 1),0);
palabras16bits = [palabras16bits colocarBits(dec2bin(uint8(abs(numDC))),categoria,negativo)];