image2data

Der Tech-Blog

...weitermachen, wo OCR aufhört

QuickSort eines (OCRObjects-)Arrays

Jan 282015

Eine häufige Anforderung ist das schnelle Sortieren von eigenen Arraystrukturen. Der QuickSort-Algorithmus ist dabei sicherlich die erste Wahl. Im folgenden Beispiel werden auf einer Seite gefundene Bitmapobjekte aufsteigend nach ihrer Höhe sortiert, um den Höhenmedian aller Objekte zu ermitteln. Diese QuickSort-Implementierung kann in den Parametern "Lo" und "Hi" noch die Grenzen des zu sortierenden Bereiches empfangen:

procedure QuickSortOCRObjectsByHeight(var OCRObjects: Ti2dOCRObjects; Lo, Hi: Integer);
var
  iLo, iHi: Integer;
  iPivot: Integer;
  rTemp: Ti2dOCRObject;
 
begin
  iLo := Lo;
  iHi := Hi;
  iPivot := OCRObjects[(iLo + iHi) div 2].Height;
 
  repeat
    while OCRObjects[iLo].Height < iPivot do
      inc(iLo);
    while OCRObjects[iHi].Height > iPivot do
      dec(iHi);
 
    if iLo <= iHi then begin
      rTemp := OCRObjects[iLo];
      OCRObjects[iLo] := OCRObjects[iHi];
      OCRObjects[iHi] := rTemp;
 
      inc(iLo) ;
      dec(iHi) ;
    end;
  until iLo > iHi;
 
  if iHi > Lo then
    QuickSortOCRObjectsByHeight(OCRObjects, Lo, iHi);
  if iLo < Hi then
    QuickSortOCRObjectsByHeight(OCRObjects, iLo, Hi);
end;
 
var
  aOCRObjects: Ti2dOCRObjects;
  oPage: TBitmap;
 
begin
  oPage := TBitmap.Create;
 
  try
    i2dLoadBitmap('anyfile.jpg', 1, oPage);
    i2dGetBitmapObjects(oPage, 2, 2, 4, 11, 5, 5, 5, 5, 3, aOCRObjects);
 
    if Length(aOCRObjects) > 0 then begin
      QuickSortOCRObjectsByHeight(aOCRObjects, 0, High(aOCRObjects));
      i2dDebugOut(Format('Der Höhenmedian aller gefundenen Objekte ist %d', [aOCRObjects[High(aOCRObjects) div 2].Height]));
    end;
  finally
    oPage.Free;
  end;
end.

Atom

powered by Nibbleblog