Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-03-2008
sionks sionks is offline
Miembro
 
Registrado: feb 2008
Posts: 22
Poder: 0
sionks Va por buen camino
Unhappy Filtro de Ruido para una Imagen

Buenas, Disculpen es que estoy relizando un filtro de Ruido llamado Rayleigh, el cula se lo aplico a una imagen, pero en mi codigo me esta marcando un error con respecto a mis valores flotantes, pero aun no he logrado descirfrar porque obtengo ese error, espero alguien me pueda ayudar, aqui les pongo la formula del ruido Rayleigh y mi codigo, muchas gracias por su atencion

Formula: H:= ((2*g)/gama) e^-(g^2/gama);

Donde:
g es el valor del canal actual
gama es un valor dado por el usuario entre 0 y 255,
por el momento yo estoy poniendo mi gama en 100


Código Delphi [-]
procedure TFImagen.RRayleigh;
var i,j: Integer;
    ExpR,ExpG,ExpB,BaseR,BaseG,BaseB,AuxR,AuxG,AuxB:double;
    P1,PC: PByteArray;
    r,g,b: Integer; //contiene los nuevos valores para cada canal
    bmp:TBitmap;
begin
  r:=0; g:=0; b:=0;    //inicializa los canales para evitar ambiguedad
  bmp:=TBitmap.Create;
  bmp.Assign(Bitmap);  //Imagen a la que se aplican los cambios
  for j:= 0 to Bitmap.Height-1 do
    begin
        P1:=Bitmap.ScanLine[j];   //fila actual
        PC:=bmp.ScanLine[j];
        for i:=0 to ancho -1 do
          begin
           BaseR:= (2*(P1[(i*3)+2]))/100;    //Obtienen las Bases
           BaseG:= (2*(P1[(i*3)+1]))/100;
           BaseB:= (2*(P1[(i*3)]))/100;
           ExpR:= -1*sqr(P1[(i*3)+2])/100;     //Obtienen los Exponentes
           ExpG:= -1*sqr(P1[(i*3)+1])/100;
           ExpB:= -1*sqr(P1[(i*3)])/100;
           AuxR:= exp(ExpR);
           AuxG:= exp(ExpG);
           AuxB:= exp(ExpB);
           r:=round(abs(BaseR*AuxR));      //Obtiene los nuevos Valores
           g:=round(abs(BaseG*AuxG));      //para los canales
           b:=round(abs(BaseB*AuxB));
           PC[i*3]:=round(b);              //se Asignan las modificaciones
           PC[(i*3)+1]:=round(g);
           PC[(i*3)+2]:=round(r);
      end;//for ancho
  end;//for alto
  Imagen.Picture.Assign(bmp);
end;
Responder Con Cita
  #2  
Antiguo 31-03-2008
odrack odrack is offline
Miembro
 
Registrado: feb 2008
Posts: 167
Poder: 17
odrack Va por buen camino
Hola, el problema es por que tienes variables de tipo integer, trata con extended y me dices.

Saludos
Responder Con Cita
  #3  
Antiguo 31-03-2008
sionks sionks is offline
Miembro
 
Registrado: feb 2008
Posts: 22
Poder: 0
sionks Va por buen camino
Ya lo hice y nada

Ya le Cambie a Extended los integer que tenia, pero aun nada, me sigue marcando el mismo error, el error, que me marca es Invalid Floating point operation.

Ahora R,G,B lo tengo como double:

ahora esta asi el codigo:
Código Delphi [-]
procedure TFImagen.RRayleigh;
var i,j: Integer;
    ExpR,ExpG,ExpB,BaseR,BaseG,BaseB,AuxR,AuxG,AuxB:double;
    P1,PC: PByteArray;
    r,g,b: Double; //contiene los nuevos valores para cada canal
    bmp:TBitmap;
begin
  r:=0; g:=0; b:=0;    //inicializa los canales para evitar ambiguedad
  bmp:=TBitmap.Create;
  bmp.Assign(Bitmap);  //Imagen a la que se aplican los cambios
  for j:= 0 to Bitmap.Height-1 do
    begin
        P1:=Bitmap.ScanLine[j];   //fila actual
        PC:=bmp.ScanLine[j];
        for i:=0 to ancho -1 do
          begin
           BaseR:= (2*(P1[(i*3)+2]))/100;    //Obtienen las Bases
           BaseG:= (2*(P1[(i*3)+1]))/100;
           BaseB:= (2*(P1[(i*3)]))/100;
           ExpR:= -1*sqr(P1[(i*3)+2])/100;     //Obtienen los Exponentes
           ExpG:= -1*sqr(P1[(i*3)+1])/100;
           ExpB:= -1*sqr(P1[(i*3)])/100;
           AuxR:= exp(ExpR);
           AuxG:= exp(ExpG);
           AuxB:= exp(ExpB);
           r:=abs(BaseR*AuxR);      //Obtiene los nuevos Valores
           g:=abs(BaseG*AuxG);      //para los canales
           b:=abs(BaseB*AuxB);
           PC[i*3]:=round(b);              //se Asignan las modificaciones
           PC[(i*3)+1]:=round(g);
           PC[(i*3)+2]:=round(r);
      end;//for ancho
  end;//for alto
  Imagen.Picture.Assign(bmp);
end;
Responder Con Cita
  #4  
Antiguo 31-03-2008
odrack odrack is offline
Miembro
 
Registrado: feb 2008
Posts: 167
Poder: 17
odrack Va por buen camino
Todas tus variables deben quedar como extended, integer solo toma valores enteros y no con decimales.
Trata cambiando todas tus variables.
Responder Con Cita
  #5  
Antiguo 31-03-2008
sionks sionks is offline
Miembro
 
Registrado: feb 2008
Posts: 22
Poder: 0
sionks Va por buen camino
Todas mis variables son Double, integre namas tengo los contadores
Responder Con Cita
  #6  
Antiguo 31-03-2008
odrack odrack is offline
Miembro
 
Registrado: feb 2008
Posts: 167
Poder: 17
odrack Va por buen camino
Hasta donde tengo entendido estas utilizando tambien tus variables del contador para multiplicar algunas cosas
Código Delphi [-]
 
BaseR:= (2*(P1[(i<--AQUI*3)+2]))/100;    //Obtienen las Bases
           BaseG:= (2*(P1[(i<--AQUI*3)+1]))/100;
           BaseB:= (2*(P1[(i<--AQUI*3)]))/100;
           ExpR:= -1*sqr(P1[(i<--AQUI*3)+2])/100;     //Obtienen los Exponentes
           ExpG:= -1*sqr(P1[(i*3)+1])/100;
           ExpB:= -1*sqr(P1[(i*3)])/100;
           AuxR:= exp(ExpR);
           AuxG:= exp(ExpG);
           AuxB:= exp(ExpB);
           r:=round(abs(BaseR*AuxR));      //Obtiene los nuevos Valores
           g:=round(abs(BaseG*AuxG));      //para los canales
           b:=round(abs(BaseB*AuxB));
           PC[i*3]:=round(b);              //se Asignan las modificaciones
           PC[(i*3)+1]:=round(g);
           PC[(i*3)+2]:=round(r);

no estoy completamente seguro, pero cuando multiplicas variables de diferente tipo marca que no son compatibles, o invalid float. Intenta tambien cambiando tus variables del contador, de todas formas no te afecta por que siempre seran enteros

Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Anuncian filtro para necedades y groserías Lepe La Taberna 1 25-11-2007 04:49:01
Filtro para codigo Delphi seoane PHP 0 07-04-2007 01:53:28
Ayuda para crear un filtro day_eli Conexión con bases de datos 7 19-01-2007 21:50:28
Filtro para Actualizar tabla... anghell77 SQL 3 21-05-2006 11:06:53
Filtro para TShellListView soul6301 Varios 1 06-06-2004 08:27:15


La franja horaria es GMT +2. Ahora son las 00:56:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi