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;