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
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;
Image.Bitmap.PixelFormat := pf24bit;
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
if ((RGB^[1] + RGB^[2] + RGB^[3]) div 3) > Maxx
then Maxx := ((RGB^[1] + RGB^[2] + RGB^[3]) div 3);
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; end;
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;
if RGB^[k] <= 0
then RGB^[k] := 0;
if RGB^[i + k] > 255
then RGB^[k] := 255;
end; inc(RGB);
end; 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
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;
Image.Bitmap.PixelFormat := pf24bit;
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; inc(RGB);
end; 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,