hey, ich hab mir gerade nen algorithmus geschrieben um die nervigen punkte heraus zu filtern aus dem image code, damit die freeware den einfacher lesen kann.
der algorithmus is nicht der beste, aber ein guter ansatz ^^
der algorithmus entfernt alleinstehende, schwarze pixel, sodass fast nur der text übrig bleibt.
das genial ist, invertiert man das bild, sodass der hintergrund schwarz und der text weiß ist, füllt er die buchstaben auf, sodass diese besser lesbar werden
der algorithmus selber ist verblüffend einfach:
- erst mach ich das bild in schwarz +weiß
- dann durchsuche ich das bild nach schwarzen pixeln, ist einer schwarz suche ich alle umliegenden pixel ab, wenn weniger als 2 pixel um den umliegenden schwarzen pixel schwarz sind, ist es zu mehr als 90% ein
alleinstehender pixel
dann werden die pixel weiß gemacht fertig ^^
hier der algorithmus :
Delphi-Quellcode:
const schwellwert = $00AAAAAA; //der schwellwert um zwischen s/w zu unterscheiden $00BBGGRR
procedure pixelremover;
var i,j,k:integer; //zähler variablen
count1:integer; //zähler für die im umkreis liegenden schwarzen pixel
blpix,blindpix:TPoint; //blpix ist der im umkreis liegende schwarze pixel
//blindpixel um den pixel als undefiniert zu setzen
arround_pix:array[0..7] of TPoint;//die acht pixel die einen umgeben
begin
blindpix.X:=-1;
blindpix.Y:=-1;
for i:=0 to Image1.Picture.Width-1 do //bild in 1bit format bringen
for j:=0 to Image1.Picture.Height-1 do
if Image1.Canvas.Pixels[i,j]>Integer(schwellwert) then
Image1.Canvas.Pixels[i,j]:=clWhite
else
Image1.Canvas.Pixels[i,j]:=clBlack;
for j:=0 to Image1.Picture.Height-1 do //bild nach schwarzen pixel absuchen
for i:=0 to Image1.Picture.Width-1 do
if Image1.Canvas.Pixels[i,j]=clBlack then begin //einer gefunden -> umliegende pixel definieren
count1:=0;
arround_pix[0].X:=i-1;//links oben
arround_pix[0].X:=j-1;
arround_pix[1].X:=i; //mitte oben
arround_pix[1].Y:=j-1;
arround_pix[2].X:=i+1;//rechts oben
arround_pix[2].Y:=j-1;
arround_pix[3].X:=i-1;//links mitte
arround_pix[3].Y:=j;
arround_pix[4].X:=i+1;//rechts mitte
arround_pix[4].Y:=j;
arround_pix[5].X:=i-1;//links unten
arround_pix[5].Y:=j+1;
arround_pix[6].X:=i;//mitte unten
arround_pix[6].Y:=j+1;
arround_pix[7].X:=i+1;//rechts unten
arround_pix[7].Y:=j+1;
if (i<1) then //check ob pixel definiert sind, ansonsten ausblenden
for k:=0 to 3 do
arround_pix[k]:=blindpix;
if (j<1) then begin
arround_pix[0]:=blindpix;
arround_pix[3]:=blindpix;
arround_pix[5]:=blindpix;
end;
if (i>Image1.Picture.Width) then
for k:=5 to 7 do
arround_pix[k]:=blindpix;
if (j>Image1.Picture.Height) then begin
arround_pix[2]:=blindpix;
arround_pix[4]:=blindpix;
arround_pix[7]:=blindpix;
end;
for k:=0 to 7 do //umliegende pixel auf farbe testen
//bei schwarz count1+1
if (arround_pix[k].X>-1)AND(arround_pix[k].Y>-1) then
if Image1.Canvas.Pixels[arround_pix[k].X,arround_pix[k].Y]<Integer(schwellwert) then begin
inc(count1);
blpix:=arround_pix[k];
end;
if count1<2 then begin
Image1.Canvas.Pixels[i,j]:=clWhite; //pixel weiß machen
Image1.Canvas.Pixels[blpix.X,blpix.Y]:=clWhite; // und den eventuell umliegenden schwarzen pixel auch
end;
end;
Image1.Picture.SaveToFile('bsp.bmp'); //speichern ^^
end;
hier noch ein paar bilder
edit: mit alleinstehenden pixeln meine ich auch pixelgruppen die aus 2 pixeln bestehen