Announcement

Collapse
No announcement yet.

Zauberstabwerkzeug mit Delphi?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zauberstabwerkzeug mit Delphi?

    Hallo!

    In guten Bildbearbeitungsprogrammen gibt es ein Zauberstabwerkzeug - Ein Tool, das einen Bildausschnitt, der gleichen Farbe hat, markiert. Ich bräuchte so etwas Ähnliches:

    Ich Habe ein bmp mit weißem Hintergrund und Schwarzen Punkten drauf (in verschiedenen Größen und Formen). Die Punkte zu finden ist ja kein Problem (indem ich einfach Zeile für Zeile durchgehe und bei jedem Pixel die Farbe abrufe) aber ich bräuchte von allen Punkten jedes enthaltene Pixel.

    So finde ich die Punkte:

    var

    iX, iY : Integer;

    begin

    iX := 0;

    iY := 0;

    while iY < Image.Picture.Height do begin

    while iX < Image.Picture.Width do begin

    if Image.Canvas.Pixels[iX, iY] = clBlack then begin

    {Jetzt habe ich den punkt...}

    end;

    inc(iX);

    end; // while

    inc(iY);

    end; // while

    end;

    Ich hoffe mir kann hier jemand helfen.

    Danke.

  • #2
    Hi Mario,<br>nicht einfach :-)<br>als Lösungsansatz würde ich vorschlagen, dass du die Helligkeit der Pixel verwendest (R+G+B)/3 und diese nach einer Abweichung untersuchst. Du könntest zum testen die Abweichung über einen Schieberegler vorgeben, um so das Ergebniss gleich zu beobachten. <br>Michae

    Comment


    • #3
      Hallo Michael!

      Danke für deine Antwort!

      In dem Bild gibt es NUR schwarze und weiße Pixcel...

      Mein Proble ist nur herauszufinden, welche Pixcel zusammengehören und zu einen schwarzen Punkt bilden, da Form und Größe immer unterschiedlich sind...

      Vielleich fällt ja noch jemandem was ein...

      Mari

      Comment


      • #4
        Hi Mario,<br>wolltest du nur wissen was du zu diesem Zeitpunkt: "{Jetzt habe ich den punkt...} " tun sollst? Diese Koordinate ist auch nicht ganz richtig. Da du horizontal scannst, ergibt sich ein oberer und unterer Rand, den du nicht berücksichtigst. Aber nehmen wir deine Schleifen mal als vorläufig richtig an, dann müsstest du nach Übergängen suchen. <br>
        </PRE>
        // white->black Übergang

        if (Image.Canvas.Pixels[iX, iY] = clwhite) and (Image.Canvas.Pixels[iX + 1, iY] = clblack) then begin Image.Canvas.Pixels[iX , iY] = clred;

        // black->white Übergang

        if (Image.Canvas.Pixels[iX + 1, iY] = clwhite) and (Image.Canvas.Pixels[iX, iY] = clblack) then begin Image.Canvas.Pixels[iX + 1, iY] = clred;

        </PRE> wobei hier die Bildweite im n+1 noch berücksichtigt werden musst!
        Du müsstest dann noch checken, ob in der Y-Achse ein Übergang liegt (Zeile +/-).<br>cu Michae

        Comment


        • #5
          Hi Michael!

          Habe schon gesehen - es ist nicht einfach eine Frage so zu formulieren, dass sie auch richtig verstanden wird...

          Die übergänge zu finden ist ja nicht das Problem - das hab ich ja alles schon geschaft.

          Mein Problem ist folgendes:

          ########################################<br>
          ######||||||#########||||##############||#####<br>
          ####||||||||#######||||||||||############||||||||| |###<br>
          ######||||||||######||||||||||||########||||||#### ###<br>
          #######||||#########||||||||||#####||||||######### <br>
          ####################||||##################<br>
          ########################################<br>

          Stell dir vor diese #-|| kombination ist das weiße Bild mit 3 schwarzen Flecken - #=clWhite und ||=clBlack.

          Nun möchte ich z.B. die Koordinaten aller || haben die den ersten Fleck bilden...

          Wie fanke ich da am blödesten an?

          Mari

          Comment


          • #6
            Hi Michael!

            Habe schon gesehen - es ist nicht einfach eine Frage so zu formulieren, dass sie auch richtig verstanden wird...

            Die übergänge zu finden ist ja nicht das Problem - das hab ich ja alles schon geschaft.

            Mein Problem ist folgendes:

            ########################################<BR>
            ######||||||#########||||##############||#####<BR>
            ####||||||||#######||||||||||############||||||||| |###<BR>
            ######||||||||######||||||||||||########||||||#### ###<BR>
            #######||||#########||||||||||#####||||||######### <BR>
            ####################||||##################<BR>
            ########################################

            Stell dir vor diese #-|| kombination ist das weiße Bild mit 3 schwarzen Flecken - #=clWhite und ||=clBlack.

            Nun möchte ich z.B. die Koordinaten aller || haben die den ersten Fleck bilden...

            Wie fange ich da am blödesten an?

            Mari

            Comment


            • #7
              Siehe mal unter FloodFill nach.

              Algo:

              1. suche schwarzen Punkt

              2. Mache floodfill mit farbe rot und diesem Punkt

              3. alle roten Pixel gehören zu diesem Objekt

              Comment


              • #8
                Hi Mario,<br> "..die Koordinaten haben.." in welcher Form, für was???<br>Möchtest du evtl. alle Punkte zu EINEM Objekt in einer eigenen Liste speichern, so daß man aus EINER Liste genau dieses Objekt wieder definieren kann?<br>Dann müsste man beim vorkommen des ersten schwarzen Punkt eine "Liste" für dieses Objekt anlegen. In dieser Liste musst du die Zeile, den Startpunkt und den Endpunkt dieses Objektes für diese Zeile schreiben, zB. "100;324;385"<br> In dieser Range (Start-Endpunkt) suchst du gleich weiter nach anschliessendem schwarz (in y-1 Richtung), bis das Objekt keinen Anschluss mehr besitzt. Das Objekt ist jetzt in einer "Liste" definiert. Jetzt musst du wieder zurück, wo du den ersten Punkt des Objektes gefunden hast und weiter in x,y suchen. Hierbei ist wichtig, die Koordinaten aller gefundenen Objekte bei einem "neuen" Punkt abzuchecken, ob dieser bereits in einem bestehenden Objekt vorhanden ist.<br>Michae

                Comment


                • #9
                  Hallo Karsten!

                  Danke für die Antwort - Genau das habe ich gesucht...

                  Gibt es noch eine schnellere Möglichkeit die entsprechenden roten Pixel zu erkennen, als Pixel für Pixel in einem gewissen Umkreis abzufragen - Die Anwendung ist leider Extrem zeitkritisch...

                  Mari

                  Comment


                  • #10
                    ja, mit scanline gehts wesentlich schneller.
                    ist dann aber etwas mehr Programmieraufwand

                    Comment


                    • #11
                      Hi!

                      Habe mir ScanLine ein bisschen angeschaut - wie kann ich damit einzelne Pixel auslesen?

                      Mari

                      Comment

                      Working...
                      X