Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Filtro de Ruido para una Imagen (https://www.clubdelphi.com/foros/showthread.php?t=54813)

sionks 31-03-2008 20:53:03

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;

odrack 31-03-2008 20:56:57

Hola, el problema es por que tienes variables de tipo integer, trata con extended y me dices.

Saludos

sionks 31-03-2008 21:05:24

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;

odrack 31-03-2008 21:14:05

Todas tus variables deben quedar como extended, integer solo toma valores enteros y no con decimales.
Trata cambiando todas tus variables.

sionks 31-03-2008 21:27:08

Todas mis variables son Double, integre namas tengo los contadores

odrack 31-03-2008 21:33:15

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


La franja horaria es GMT +2. Ahora son las 09:15:48.

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