![]() |
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 ;-) ... |
Re: Gleiche Listboxeinträge zählen
Zitat:
Zitat:
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 ;) |
Re: Gleiche Listboxeinträge zählen
^^ Ich hätte einfach nicht schreiben sollen was ich vorhabe, sondern nur wo das Problem is ;-)
Zitat:
Zitat:
Zitat:
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 |
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 |
Re: Gleiche Listboxeinträge zählen
Eine gute Idee ich werds gleich mal probieren danke :-)
|
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 |
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.
|
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 |
Re: Gleiche Listboxeinträge zählen
Hallo,
Zitat:
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 |
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 18:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz