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
domingo, 6 de noviembre de 2011
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
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)];
lunes, 31 de octubre de 2011
Binarios positivos y negativos de hasta 7 bits
#include "stdafx.h"
#include "stdio.h"
#include "math.h"
int A[]={127,-2,2,5,1,-8,-127,4,45,-45,23,67,-23};
int i;
int n;
int x1;
int a;
int b;
int x2;
int c;
int x3;
int d;
int x4;
int e;
int x5;
int f;
int x6;
char num;
int B= sizeof(A)/4;
char Bi[6];
printf(" %d \n",B);
for (i=0;i0){
n=A[i];
a=n%2;
x1=n/2;
b=x1%2;
x2=x1/2;
c=x2%2;
x3=x2/2;
d=x3%2;
x4=x3/2;
e=x4%2;
x5=x4/2;
f=x5%2;
x6=x5/2;
printf("El numero %d es: %d%d%d%d%d%d%d\n",A[i],x6,f,e,d,c,b,a);
}
else{
n=abs(A[i]);
a=n%2;
x1=n/2;
b=x1%2;
x2=x1/2;
c=x2%2;
x3=x2/2;
d=x3%2;
x4=x3/2;
e=x4%2;
x5=x4/2;
f=x5%2;
x6=x5/2;
if(x6==1){x6=0;}
else{x6=1;}
if(d==1){d=0;}
else{d=1;}
if(c==1){c=0;}
else{c=1;}
if(b==1){b=0;}
else{b=1;}
if(a==1){a=0;}
else{a=1;}
if(e==1){e=0;}
else{e=1;}
if(f==1){f=0;}
else{f=1;}
printf("El numero %d es: %d%d%d%d%d%d%d\n",A[i],x6,f,e,d,c,b,a);
}
}
scanf( "%i", &num );
return 0;
}
#include "stdio.h"
#include "math.h"
int A[]={127,-2,2,5,1,-8,-127,4,45,-45,23,67,-23};
int i;
int n;
int x1;
int a;
int b;
int x2;
int c;
int x3;
int d;
int x4;
int e;
int x5;
int f;
int x6;
char num;
int B= sizeof(A)/4;
char Bi[6];
printf(" %d \n",B);
for (i=0;i0){
n=A[i];
a=n%2;
x1=n/2;
b=x1%2;
x2=x1/2;
c=x2%2;
x3=x2/2;
d=x3%2;
x4=x3/2;
e=x4%2;
x5=x4/2;
f=x5%2;
x6=x5/2;
printf("El numero %d es: %d%d%d%d%d%d%d\n",A[i],x6,f,e,d,c,b,a);
}
else{
n=abs(A[i]);
a=n%2;
x1=n/2;
b=x1%2;
x2=x1/2;
c=x2%2;
x3=x2/2;
d=x3%2;
x4=x3/2;
e=x4%2;
x5=x4/2;
f=x5%2;
x6=x5/2;
if(x6==1){x6=0;}
else{x6=1;}
if(d==1){d=0;}
else{d=1;}
if(c==1){c=0;}
else{c=1;}
if(b==1){b=0;}
else{b=1;}
if(a==1){a=0;}
else{a=1;}
if(e==1){e=0;}
else{e=1;}
if(f==1){f=0;}
else{f=1;}
printf("El numero %d es: %d%d%d%d%d%d%d\n",A[i],x6,f,e,d,c,b,a);
}
}
scanf( "%i", &num );
return 0;
}
domingo, 30 de octubre de 2011
sábado, 29 de octubre de 2011
Decodificacion en C++
Decodificacion en C++ de numeros positivos y negativos
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
char* numerounico(char dato[]); //Para transformar cuando es un solo bit
char* numeronegativo(char a[]); //detecta si el numero es negativo
double transformacion(char binario[]);//transforma a decimal el string de binarios
int main(int argc, char* argv[]){
double y; //numero a mostrar
char secuencia_bits[]={"0101"}; //secuencia entrante de bits
if (secuencia_bits[0]=='0'){//detecta si el string de bits es negativo
if (strlen(secuencia_bits)==1){ //detecta si el string es de un solo bit
y=(-2)*transformacion(numerounico(secuencia_bits));
}
else{ //si es mas grande que uno llama a la subfuncion numero negativo
y=(-1)*transformacion(numeronegativo(secuencia_bits));
}
}
else {// El string de bits es positivo
if (strlen(secuencia_bits)==1){ //detecta si es un solo bit
y=2*transformacion(secuencia_bits);
}
else{
y=transformacion(secuencia_bits);//transforma directamente el a decimales
}
}
cout<<y<<endl; //imprime el numero en decimal positivo o negativo
system("PAUSE");
return EXIT_SUCCESS;
}
char* numerounico(char dato[]){ //reemplaza unos por ceros para hacer el complemento cuando es numero unico
if (dato[0]=='0'){
dato[0]='1';
}
else{
dato[0]='0';
}
return dato;
}
char* numeronegativo(char a[]){ //reemplaza uno por ceros cuando es mayor a uno la cadena de caracteres
int i;
double p;
for(i=0;i<strlen(a);i++){
if(a[i]=='0'){
a[i]='1';
}
else if(a[i]=='1'){
a[i]='0';
}
}
return a;
}
double transformacion(char binario[]){ //transforma la cadena de binarios a decimal
int i,j;
double h=0;
for(i=strlen(binario);i>-1;i--){
if(binario[i]=='1'){
j=strlen(binario)-i;
h+=pow(2,j);
}
}
h=h/2;
return h;
}
jueves, 27 de octubre de 2011
Suscribirse a:
Entradas (Atom)