Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Gleiche Listboxeinträge zählen (https://www.delphipraxis.net/146327-gleiche-listboxeintraege-zaehlen.html)

Erebos 18. Jan 2010 09:07


Gleiche Listboxeinträge zählen
 
Hey Leute ich habe ein Probelm ich möchte ein Programm schreiben, welches erkennt wie oft eine Farbe in einem Bild vorkommt.
Hierfür durchlaufe ich das geladene Bild und lese jeden Pixel einzelnt aus und speichere ihn in einer Listbox. Nun möchte ich, das gezählt wird wie oft zum Beispiel die Farbe Grün (durch diesen Wert in der LB gespeichert: 3955356) vorkommt. Und am besten wie oft jede Farbe vorkommt. Danach könnt man eine Häufigkeitsanalyse machen "Was sind die 10 häufigsten Farben des Bildes" oder so...
Ich komme einfach nicht weiter hat jemand von euch eine Idee?

PS: Es ist zu beachten das es verdammt viele Einträge sind ;-) ...

jfheins 18. Jan 2010 09:16

Re: Gleiche Listboxeinträge zählen
 
Zitat:

Zitat von Erebos
Hey Leute ich habe ein Probelm ich möchte ein Programm schreiben, welches erkennt wie oft eine Farbe in einem Bild vorkommt.
Hierfür durchlaufe ich das geladene Bild und lese jeden Pixel einzelnt aus und speichere ihn in einer Listbox.

Das erinnert mich daran:
Zitat:

Herr Schmidt, ich habe gehört sie können wahnsinning schnell zählen.
:arrow: Ja, das ist richtig. Wollen sie mich auf die Probe stellen?
Okay, wieviele Ameisen sind dort in dem Ameisenhaufen?
:arrow: 456615 !
Okay, wie haben sie das gemacht?
:arrow: Ganz einfach: Beine gezählt und durch 6 geteilt!
:mrgreen:

Also verzichte auf die Listbox (was soll der user damit anfangen??) und zähle die Farben einfach direkt ;)

also zwei schleifen machen, und den Pixel mit der gesuchten Farbe vergleichen. Wenn's passt einen Zähler um 1 erhöhen.

Bei Bildern mit geringer Farbtiefe kannst du auch Bucketsort verwenden, dann hast du direkt alle Farben die im Bild vorkommen mit der entsprechenden Häufigkeit ;)

Erebos 18. Jan 2010 10:38

Re: Gleiche Listboxeinträge zählen
 
^^ Ich hätte einfach nicht schreiben sollen was ich vorhabe, sondern nur wo das Problem is ;-)

Zitat:

Also verzichte auf die Listbox (was soll der user damit anfangen??) und zähle die Farben einfach direkt Wink
Die Listbox hat schon ihren Sinn :-D ... Ich entscheide das jetzt einfach mal so ;-)

Zitat:

also zwei schleifen machen, und den Pixel mit der gesuchten Farbe vergleichen. Wenn's passt einen Zähler um 1 erhöhen.
Es gibt keine gesuchte Farbe ;-) ... Alle Farben sollen gesucht werden und die Häufigkeit wird in Pixeln angegeben

Zitat:

Bei Bildern mit geringer Farbtiefe
Handelt sich leider nicht um Bilder mit geringer Farbtiefe...

Danke trotzdem ich werd selbst noch ein bisschen was versuchen!
WICHTIG ist aber das die Listbox benutzt wird und ich suche eingentlich nur eine Prozedure die gleiche Listboxeinträge zusammenfasst ... dann wäre ich glücklich ;-)

Mfg

Erebos

Sherlock 18. Jan 2010 10:49

Re: Gleiche Listboxeinträge zählen
 
Ich würde nicht direkt in die Listbox schreiben, sondern erstmal in eine sortierte Stringliste. Wenn alles drin steht kannst Du einfach durch die Liste gehen, die gleichen Einträge zählen und in Deine Auswahl setzen.

Sherlock

Erebos 18. Jan 2010 11:01

Re: Gleiche Listboxeinträge zählen
 
Eine gute Idee ich werds gleich mal probieren danke :-)

hoika 18. Jan 2010 11:07

Re: Gleiche Listboxeinträge zählen
 
Hallo,

willst du wirklich alle Pixel in die ListBox packen ?
Du weisst schon, dass der Speicher einer ListBox begrenzt ist.

Ich würde das etwas anders machen
(deine ListBox kannst du ja drinlassen ;) )

Delphi-Quellcode:
type
  TColorItem = class
    Color: TColor;
    Number: Integer;
  end;

type
  TColorItemList = class(TObjectList)
    private
     // mit for-Schleife nach der Farbe suchen
     // NIL, wenn nicht gefunden
      function FindColorItem(theColor): TColorItem;
    public
      procedure AddToColor(theColor: TColor);
  end;

procedure TColorItemList.AddToColor(theColor: TColor);
var
  ColorItem: TColorItem;
begin
  ColorItem:= FindColorItem(theColor);
  if ColorItem=NIL then
  begin
    ColorItem:= TColorItem.Create;
    Add(ColorItem);
  end;

  ColorItem.Number:= ColorItem.Number+1;
end;

Heiko

Medium 18. Jan 2010 11:20

Re: Gleiche Listboxeinträge zählen
 
Dir ist aber schon bewusst, dass du dann im Extremfall 2^24 = 16.777.216 Einträge in deiner Listbox hast, oder? Bzw. genauer bis zu MIN(Bitmap.Width*Bintmap.Height, 2^24). Es gab mal Zeiten, da ging nicht mehr als 64k Einträge eine ListBox, ich weiss nicht wie das bei neuren Delphis aussieht - von der Übersichtlichkeit mal ganz abgesehen.

Erebos 18. Jan 2010 11:42

Re: Gleiche Listboxeinträge zählen
 
ja ne ich schrumpfe das Bild vorher zusammen und errechne dann den %satz der jeweiligen Farbe ^^ sonst wäre das n bisschen ääähhh ja ... :-D


Hab das jetzt mit der sortierten Stringliste gemacht
-> Ich lese die Pixel in die sortierte Stingliste
-> speicher den ersten String in ner Variable ("Gleich") und vergleiche diesen String solange mit den nächsten in der Liste bis der sich ändert
-> diese Zahl speicher ich in ner Variable(x) lösche dann die ersten x Stings aus der liste
-> Schreibe in die Listbox(Gleich+'ist'+IntToStr(x)+' mal vorhanden)
das is jetzt nur für mich die ausgabe kommt halt noch in % aber das is ja denn nich sonderlich schwer.

Danke für die Hilfe!
Mfg
Erebos

hoika 18. Jan 2010 12:33

Re: Gleiche Listboxeinträge zählen
 
Hallo,

Zitat:

ich weiss nicht wie das bei neuren Delphis aussieht
Das ist eine Beschränkung von Windows.
Umgehen kann man das mit OwnerDraw oder man nimmt einfach den schickeren ListView.

Verstanden habe ich aber immer noch nicht,
wie man (beliebige) Farben mit einer StringList zählt,
aber egal ;)


Heiko

Sherlock 18. Jan 2010 13:35

Re: Gleiche Listboxeinträge zählen
 
Wie man mit einer TStringList Farben zählt:
Farben werden numerisch repräsentiert. Diese Zahl kann man in eine sortierte Stringliste schreiben. Sortiert deshalb, weil alle gleichen Farbeinträge dann nacheinander drinstehen werden. Wenn man mit dem Wegschreiben der Farben fertig ist, geht man in einer Schleife (die Erebos ja beschrieben hat) durch die Liste und zählt halt.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz