Einzelnen Beitrag anzeigen

Benutzerbild von jokerfacehro
jokerfacehro

Registriert seit: 13. Feb 2007
306 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: Text aus Image extrahieren

  Alt 8. Aug 2007, 23:42
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
Angehängte Grafiken
Dateityp: bmp image_code1_164.bmp (31,6 KB, 115x aufgerufen)
Dateityp: bmp image_code_2_127.bmp (31,6 KB, 122x aufgerufen)
  Mit Zitat antworten Zitat