Einzelnen Beitrag anzeigen

ari-rakete

Registriert seit: 10. Aug 2009
1 Beiträge
 
#1

Streifen in Bitmap finden

  Alt 11. Aug 2009, 18:22
Hallo Leute,

ich bin in Delphi ein Neueinsteiger und muss jetzt ein Programm entwickeln wo ich nicht weiter komme , was folgende Aufgaben hat:


Ich suche Anregungen um meine Streifen (haben unterschiedliche Grauwerte, die ich mit einem entsprechenden Programm in einen bestimmten Wert umwandeln kann) in einen Bitmap zu ermitteln und zu charakterisieren...

- die Streifen (orderschiedliche Anzahl je nach Bild) sollen als Rechtecke in ein Bitmap gefunden werden
quasie der höchsten, die breitesten und tiefsten Punkte sollen Maßstab für das Rechteck haben
_____
|..xxx..|
|xxx...|
|..xx..|
|xxxxx|
-------
x:=Pixel
Probleme sind:
- die Streifen können sich überlagern oder unterbrochen sein, obwohl sie
zusammen sind; sie können unterschiedlich breit und lang sein (siehe Bild)

- wenn ich ein Pixel nach Spalte und später Zeile abfrage, muss das erste Pixel nicht das Höchste, Breiteste oder tiefste eines Rechteckes sein
- Pixel müssen so zusammen gehören, dass sie oberhalb oder unterhalb des Pixels ist.

- wenn das Programm alles durchläuft soll es feststellen ob der Pixel schon sich in einem Rechteck
befindet;
wenn nein soll er es als neues Rechteck speichern (quasi in ein Array mit laufender Nummer)
--> Ständig aktualisieren

- als weiteres sollen die Rechtecke markiert und gespeichert werden (mit ihren Koordinaten), damit
ich es später mit einen Kreuzkorrelationsprogramm mit dem anderen Bild (das zeitgleich in der
gleichen Ebene aufgenommen wurde) vergleichen werden kann um später die 3
Richtungskoordinaten im Raum zu errechnen und es in 3D darstellen kann

ich habe es schon mit Schleifen probiert, aber meine Variante ist nicht die beste mit 4 Schleifen...

Kann mir jemand Tipps geben, wie ich es umsetzen kann?!

Danke.

Ariane

Code:

type
coordinate = record
x:Integer;
y: Integer;
end;
type
rechteck = record
linksOben = coordinate;
rechtsoben = coordinate;
linksUnten = coordinate;
rechtsUnten = coordinate;
end;
TForm1 = class(TForm)
    BildLaden: TButton;
    Image1: TImage;
    RechteckSuchen: TButton;
    Image2: TImage;
    OpenPictureDialog1: TOpenPictureDialog;
    Memo1: TMemo;
    NeuesBildSpeichern: TButton;
    procedure BildLadenClick(Sender: TObject);
    procedure SpeichernNeuesBildClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    x,y,r,g,b:Integer;
    Bildname: String;
    Verzeichnis: String;
    Bildauswahl: String;
    Bitmap: TBitmap;
    Procedure BildpunkteFinden;

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{--}
function TForm1.BildpunkteFinden(bitmap: TBitmap): TBItmap;


type
    PCardinalArray= ^TCardinalArray;
    TCardinalArray= array[0..MaxInt shr 3-1] of Cardinal;


Var
   x,y:Integer;
   a,b:Integer; //überschreiben//
   v:Array of coordinate;
   ScanLine:PCardinalArray;
    rechteck:rechteck

begin
SetLength(v,100);
     for y:=0 to Bitmap.Height-1 do
      begin
           ScanLine:= Bitmap.ScanLine[y];
           for x:=0 to Bitmap.Width-1 do
           if ScanLine[x]>=250 then //Grauwert später über einen Scroll bestimmen bzw. einstellen//
            begin
                rechteck.linksoben.x:=x;
      rechteck.linksoben.y:=y;
      for a:=x to Bitmap.Width-1 do
      begin
      Inc(a); //wird um eins hochgezählt
      if ScanLine[a]>=250 then
      begin
         rechteck.rechtsoben.x:=a;
         rechteck.rechtsoben.y:=y;
      else
         begin
            break;
         end;
      
             
      end;
            end;
      end;
end;

{--}
  Mit Zitat antworten Zitat