Ver Mensaje Individual
  #8  
Antiguo 14-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Reputación: 27
Delphius Va camino a la fama
Bueno schaka,
Tu código fue resumido, parte del mismo se podía mejorar y eso hice. Tal como dices, tu código genera una imagen en negro. Creo que tienes mal la definición del filtro.

Tu código, que lo incorporé en un procedimiento llamado filtradoLogaritmicoA quedó así:

Código Delphi [-]
procedure TForm1.filtradoLogaritmicoA(Image: TPicture);
var Maxx, Minx, pixel: integer;
    i, j, k: integer;
    bmp: TBitmap;
    RGB: ^TRGB;
begin
  //Chequeamos que sea BMP
  // sino la convertimos
  if not (Image.Graphic is TBitmap)
     then begin
            bmp:= TBitmap.Create;
            try
              bmp.Width:= Image.Width;
              bmp.Height:= Image.Height;
              bmp.Canvas.Draw(0,0,Image.Graphic);
              Image.Assign(Bmp);
            finally
              Bmp.Free;
            end;
          end;
  // le damos formato a 24 bits
  // esencial para poder trabajar con RGB
  Image.Bitmap.PixelFormat := pf24bit;

  // empezamos...
  Maxx := 0; Minx := 255;
  for j := 0 to Image.Bitmap.Height - 1 do
    begin
      RGB := Image.Bitmap.ScanLine[j];
       for i := 0 to Image.Bitmap.Width - 1 do
        begin
          // buscamos al mayor
          if ((RGB^[1] + RGB^[2] + RGB^[3]) div 3) > Maxx
             then Maxx := ((RGB^[1] + RGB^[2] + RGB^[3]) div 3);
          // buscamos al menor
          if ((RGB^[1] + RGB^[2] + RGB^[3]) div 3) < Minx
             then Minx := ((RGB^[1] + RGB^[2] + RGB^[3]) div 3);

          pixel := (Maxx - Minx) div(Maxx + Minx);

          inc(RGB);
        end; //fin while
    end; // fin j

  // aqui comienza el filtro
  for j := 0 to Image.Bitmap.Height - 1 do
    begin
      RGB := Image.Bitmap.ScanLine[j];
      for i := 0 to Image.Bitmap.Height - 1 do
        begin
          for k := 1 to 3 do
            begin
              if RGB^[k] <= 0
                 then  RGB^[k]:= 1;
              RGB^[k]:= 2 * round(ln(pixel) + ln(RGB^[k])) + 5;

              // que no era la formula así: a * log(m * x) + b?
              //RGB^[k]:= 2 * round(log10(pixel * RGB^[k])) + 5;

              // controlar el rago del valor
             if RGB^[k] <= 0
                then RGB^[k] := 0;

             if RGB^[i + k] > 255
                then RGB^[k] := 255;
            end; // fin k
        inc(RGB);
        end; // fin i
    end;
end;

Como dije... yo la formula me la conocía así: q = L x ln(1 + p) / ln(1 + L)
Por lo que hice la prueba... y que crees, parece que funciona... al menos con las imagenes que puse no las puso en blanco ni en negro.

Mi código es simple, "parecido" al tuyo mejorado. Lo llamé filtradoLogaritmicoB:

Código Delphi [-]
procedure TForm1.filtradoLogaritmicoB(Image: TPicture);
var
    i, j, k: integer;
    bmp: TBitmap;
    RGB: ^TRGB;
begin
  //Chequeamos que sea BMP
  // sino la convertimos
  if not (Image.Graphic is TBitmap)
     then begin
            bmp:= TBitmap.Create;
            try
              bmp.Width:= Image.Width;
              bmp.Height:= Image.Height;
              bmp.Canvas.Draw(0,0,Image.Graphic);
              Image.Assign(Bmp);
            finally
              Bmp.Free;
            end;
          end;
  // le damos formato a 24 bits
  // esencial para poder trabajar con RGB
  Image.Bitmap.PixelFormat := pf24bit;

  // empezamos...
  // aqui comienza el filtro
  for j := 0 to Image.Bitmap.Height - 1 do
    begin
      RGB := Image.Bitmap.ScanLine[j];
      for i := 0 to Image.Bitmap.Height - 1 do
        begin
          for k := 1 to 3 do
            begin
              RGB^[k]:= trunc(255 * ln(1 + RGB^[k]) / ln(1 + 255));
            end; // fin k
        inc(RGB);
        end; // fin i
    end;
end;

Siendo TRGB de esta forma:

Código Delphi [-]
TRGB = array [1..3] of byte;

No encontré ente mis apuntes, yo recordaba tener en algún lado algo sobre el filtrado logaritmico... y como no estaba seguro de la fórmula, busqué en internet un poco y salio un sitio que la muestra como la recordaba.

Sin embargo, también recuerdo de algun lado, que vi una fórmula como la que tu indicas ( a * log(m * p) +b) pero entre mis apuntes no está...

Debe ser que lo he perdido durante la falla de mi disco y no lo tengo entre mis discos de respaldos.

Podríamos esperar a seoane para ver con que nos sale. Si es que el se acuerda de algo. Tengo que admitir que mucho de los filtros no recuerdo... como lo vi he hice lo necesario para continuar, no profundizé mis conocimientos.

Espero que esto te sea de ayuda.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita