Einzelnen Beitrag anzeigen

bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

HOUGH : Punkte aus dyn. Array löschen, Lokale Maxima finden

  Alt 24. Jul 2012, 10:52
unter http://sourceforge.net/projects/houghtransforma/ gibt es ein Demoprojekt um
Kreise und Linien in einem Bild zu erkennen.

Jeder Kreismittelpunkt wird als lokales Maximum einer Funktion Z=f(x,y) dargestellt. ( aHoughResult : THoughResult)
Wenn ich an einer Position ein Maximum gefunden habe kann im Abstand R um diesen Punkt kein weiterer Kreis liegen. Das kleinere Maximum innerhalb meines Radius R um einen Maxima- Punkt entsteht zB. durch Rauschen im Bild oder anderes Effekte.

Ich muss also in einem dyn. array alle Punkte überprüfen ob sie näher als ein gegebener Abstands-Wert MinPeakDistance beisammenliegen , den Punkt mit dem größten Z Wert beihalten und alle Punkte mit kleineren Z Werten dann löschen.

Sieht jemand warum der Code unten nicht dieses Problem löst ?



Delphi-Quellcode:

///
/// exchange two array elements
///
procedure ExchangeArrayElements (var AHoughResultsArray: THoughFinal;
  const AIndex, BIndex: integer);
var aPoint3D : THPoint3D;
begin
      aPoint3D := AHoughResultsArray[AIndex];

      AHoughResultsArray[AIndex] := AHoughResultsArray[BIndex];

      AHoughResultsArray[BIndex] := aPoint3D;
end;

///
/// aHoughFinal -> T3DPoint (x,y,z)
/// algo: Für alle Array Elemente ....
/// solange Entfernung zwischen (P1-P2) < Min. Entferung
/// lösche Punkt mit kleinerem z Wert
///
procedure HoughResultToParameterDynamic(aHoughResult: THoughResult; Range: Real;
  var aHoughFinal: THoughFinal; MinPeakDistance: integer; var deleteElementCount : Integer); overload;

var
  len_Hough: integer;
  i, j, iter: integer;
  Distance: integer;
  rescan_from_i_position : Boolean;
begin

  deleteElementCount := 0;

  /// extract from Hough Accu results only the peaks
  HoughResultToParameterDynamic(aHoughResult, Range, aHoughFinal);

  iter := 0;

  /// lösche nahe beieinander liegende Maxima Peaks
  repeat

  i := Iter;

    repeat

    inc(i);

    rescan_from_i_position := false;

      /// wie weit sind 2 Punkte entfernt ?
      Distance := abs(aHoughFinal[iter].X - aHoughFinal[i].X) +
        abs(aHoughFinal[iter].Y - aHoughFinal[i].Y);

      /// zunahe ?? -> dann lösche Punkt mit kleinerem Z Wert
      if (Distance < MinPeakDistance) then
        if (aHoughFinal[iter].z > aHoughFinal[i].z) then
        begin
          DeleteArrayElement(aHoughFinal, i);

          inc(deleteElementCount);

        end
        else
        begin
          rescan_from_i_position:=true;

          ExchangeArrayElements(aHoughFinal, i, iter);

          DeleteArrayElement(aHoughFinal, i);

          inc(deleteElementCount);
        end;

      len_Hough := length(aHoughFinal);

    until ((i > len_Hough - 1) or (rescan_from_i_position=true));

    if not rescan_from_i_position then Inc(iter);

  until (iter > len_Hough - 2);

end;
  Mit Zitat antworten Zitat