![]() |
Farbmittelwert
Ich habe jetzt ein bisschen in der DP geschnüffelt und fand die "kleine_version_129.exe" von "Auenkrebs" sehr amüsant. Leider hilft mir das nicht so wirklich weiter.
Mein Anliegen ist es, eine Anzahl Pixel in einem Bitmap im Farbwert zu mitteln. Sowas wie, ![]() nur mit einem "Rechteck" von Pixeln auf meinem Bitmap. Aus diesem Mittelwert möchte Ich dann mit einer variablen Toleranz in Prozent alle Pixel auf dem Bild ausfindig machen. Die Pixel, welche in den Tolleranz Bereich fallen, werden dann zum Beispiel schwarz gezeichnet. Wenn man im Photoshop mal den "Zauberstab" benutzt, kommt es meinen Vorstellungen schon sehr nahe, nur das keine Pixel selektiert werden sollen. Hat jemand Erfahrung, wie man da vorgeht? Grüße und eine schönen freien Tag. |
AW: Farbmittelwert
Und was genau ist denn nun das Problem?
Laut deiner total aussagefähigen Überschrift: "Wie berechnet man einen Mittelwert?", bzw. "Woraus besteht ein RGB-Farbwert?". Antwort: Fra mal deinen Mathelehrer, warum er es die nicht beigebracht hat oder schau bei Wiki. - Wie geht man alle Pixel in einem vorgegebenem Bereich (Rechteck) durch? (1-2 Schleifen) - Wie zerlegt man einen Farbwert? (RGB, ![]() - Wie berechnet man einen Mittelwert aus mehreren Werten. (jeden Farbkanal einzeln) - Wie setzt man diese Farbkanäle wieder zusammen? ( ![]() - Wie findet man ähnliche Farbwerte? (Ähnlichkeitsvergleich ... da mußt du dir erstmal überlegen, WAS für dich "ähnlich" ist) |
AW: Farbmittelwert
Ich hätte mir folgendes gewünscht:
Zitat:
Warum kein Wort über Scanline? Zitat:
Die WinApi Funktionen kann Ich nicht benutzen (FM) Zitat:
Ich habe keine Farbkanäle da es sich um HSV/HSL Werte handelt Zitat:
Zitat:
(Sorry der musste sein, Ich bin aber nicht Nachtragend) Zitat:
Dankesehr. Ich frage mich übrigens grade, wie ich einen RGB(Red,Green,Blue) Wert schlank in ein $FFFFFFFF 4Byte Hex Wert konvertiere... |
AW: Farbmittelwert
Zitat:
![]() Guck dir mal ![]() |
AW: Farbmittelwert
Zitat:
Delphi-Quellcode:
Zur Ähnlichkeit:
var
r, g, b: Byte; myColor: TColor; begin myColor := (b shl 16) or (g shl 8) or r; end; Wenn du schon im HSV/HSL Raum bist, ist's imho schon etwas einfacher Ähnlichkeit zu definieren. Da reicht es ja schon fast, Kanalweise mit etwas Toleranz heranzugehen. Beim H-Kanal würde diese dann recht klein ausfallen, bei S und V/L ggf. etwas größer. Was jetzt aber wirklich ähnlich ist, hängt einzig und allein von deiner persönlichen Einschätzung ab. Der Begriff ist nicht eindeutig definiert. Für die Durchschnitte würde es sich hier lohnen, die HSV Werte als Koordinaten innerhalb der (Doppel-)Pyramide aufzufassen, die diese Räume aufspannen. Schau dir einfach mal den Wikipedia Artikel zu HSV an, dann wird schnell deutlich was ich meine. (Man kann theoretisch auch ganz naiv kanalweise mitteln wie bei RGB, hat aber bei H das Problem des Nulldruchgangs - es ist ja eigentlich ein Winkel.) |
AW: Farbmittelwert
Nur mal ganz kurz: man kann Farben auch zwischen den verschiedenen Farbmodellen umwandeln, ich kann Dir jetzt keine Quelle nennen (außer Google :wink:), aber vielleicht hilft das, wenn Du ein Modell nimmst, in dem Du leichter rechnen kannst.
Grüße |
AW: Farbmittelwert
Für den Mittelwert kannst Du folgende Funktion nutzen;
(Hab' ich jetzt nicht getestet, kommt aber aus einem anderen Projekt und wurde nur für das Posting angepasst) Das "Rechteck" ist in diesem Fall die gesamte an die Funktion übergebene Bitmap.
Delphi-Quellcode:
Die 'Binarisierung' (Pixel innerhalb der Toleranz schwarz zeichnen) findest Du sicherlich selbst.
Type
TRGB = record r: byte; g: byte; b: byte; end; Function TForm1.FarbWerte(Bitmap:TBitmap):TRGB; type pixarray = Array[1..3] of Byte; var y , x, zaehler, rot, gruen, blau : Integer; RGB:TRGB; P : ^pixarray; begin bitmap.PixelFormat := pf24bit; rot:=0; gruen:=0; blau:=0; zaehler:=0; RGB.r := 0; RGB.g := 0; RGB.b := 0; for y := 0 to BitMap.Height - 1 do begin P := BitMap.ScanLine[y]; for x := 0 to BitMap.Width - 1 do begin Inc(zaehler); rot := rot + P^[3]; gruen := gruen + P^[2]; blau := blau + P^[1]; Inc(P); end; end; // Mittelwert berechnen if zaehler > 0 then begin RGB.r := rot div zaehler; RGB.g := gruen div zaehler; RGB.b := blau div zaehler; end; result := RGB; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 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