Archiv verlassen und diese Seite im Standarddesign anzeigen : ist rot wirklich rot? von wo bis wohin ist rot rot beim rgb
hallo.
ich habe folgendes problem.
ich habe ein programm geschrieben, welches bilder meiner webcam untersucht. nun soll dieses programm in der lage sein einen roten ball auf dem bild zu finden.
wie jeder weis gibt es leider tausend verschiedene variationen von rot und ich kann nicht für jede einzelne das rgb-muster in mein c++-programm schreiben.
gibt es einen kleinen algor. nach dem man ein pixel kontrollieren kann ob es wirklich rot ist?
danke, mfg nikolai
FireBird2002
29.07.2004, 15:18
Wahrscheinlich mußt du das Programm erstmal auf die WebCam eichen, einfach ein rotes Papier(wirklich rot also #FF0000, bzw. so rot wie der Ball) vor die Webcam halten und in verschiedenen Entfernungen aufnehmen. Dadurch weißt du ob du evtl. inhomogenes Umgebungslicht hast. Bei den 1. paar Fotos sollte die Webcam komplett nur das Papier erfassen, somit kann das Prog lernen was Rot ist. Das Geliche giklt eben auch für grün und blau.
Du müsstest spezifizieren was bei dir "rot" ist. Wenn da auch lila oder gelb-Töne dazugehören, dann ist rot: r>g & r>b. Wenn rot auch wirklich nur rot sein soll, dann ist r>>g & r>>b optimalerweise ist g=b=0.
Rechne RGB in HSV um. HSV steht fuer Hue (Farbe), Saturation (Saettigkeit) und Value (Wert, Staerke). Programmierte algos gibt es dazu genug. Der Vorteil ist ebend, dass die Farbe lediglich durch H repraesentiert wird und S und V Eigenschaften der Farben steuern.
Fuer dein Problem also wesentlich besser geeignet. Du musst lediglich den H Wert abgrenzen.
mfg
DanDanger
29.07.2004, 23:03
Hi,
normalerweise legst du einfach eine "Farbkugel" fest. Innerhalb dieser "Kugel" ist alles "Rot" :
Du musst Dir vorstellen, das du einen 3-Dimensionalen Raum hast, nur das die Achsen jetzt nicht mehr X, Y und Z, sondern R, G, B (oder H, S, V) heissen.
Viele Geometrische Algorithmen machen auch im "Farbraum" Sinn,
z.B. der Abstand 2er Punkte (bzw. hier : der Abstand 2er Farben).
Um zu bestimmen, ob eine Farbe "Rot" ist, bestimmst du einfach dessen
"Farb-Abstand" zu deinem Referenz-Rot.
R1, G1, B1 = "Referenz-Farbe"
R2, G2, B2 = "Farbe des zu Untersuchenden Pixels"
double FarbAbstand = sqrt((R1-R2)^2 + (G1-G2)^2 + (B1-B2)^2) ;
if (FarbAbstand < THRESHOLD) THEN FarbeIstRot ELSE FarbeIstNichtRot ;
Je nachdem, wie gross Du den THRESHOLD-Grenzwert wählst, wird deine Kugel im Frabraum grösser oder kleiner.
Je kleiner der Wert, desto näher muss die Pixelfarbe am "Referenz-Rot" liegen, um noch als "Rot" gewertet zu werden...
Ich hoffe, ich habe das einigermassen verständlich erklärt, wenn nicht, einfach nochmal melden.....
Der Vorteil dieser Vorgehensweisse ist, das Du über den THRESHOLD-Wert bestimmen kannst, was aller "Rot" sein soll. Wenn dieser Wert gross genug ist (eine Tolle "Stellschraube" zum ausprobieren in der Digitalen Bilderkennung),
kannst Du so z.B. auch Pink-Töne oder andere "Rot-Variationen" als gültiges "Rot" erkennen, ohne dich mit der genauen RGB (oder HSV)-Zusammensetzung der Farbe herumzuschlagen.
Ich würde aber auch Vorschlagen, deine RGB-Werte erstmal in HSV-Werte umzurechnen. Das Problem beim RGB-Frabraum ist, das selbst (für das Menschliche Auge) kleine Farbnuancen, vergleichsweise riesige Sprünge im RGB-Farbraum zur Folge haben. Der HSV-Farbraum ist da wesentlich "unempfindlicher" und entspricht mehr dem "menschlichen" Seh-empfinden.
Der o.g.Algorithmus ist ja in beiden Fällen der gleiche (einfach R,G,B gegen H,
S,V austauschen)....
Gruss
DanDanger
Diogenes
31.07.2004, 12:33
Als ehemaliger Farbentöner hatte ich das Problem mit meiner Wet-Cam (also den Augen... :) ).
Ich halte die Sache mit HSV, also mit der Tönung H für ein gutes Verfahren. Zusätzlich solltest Ihr, Nikolai und ilute, allerdings für die Abgrenzung ein Fuzzy-Logic-Verfahren versuchen. Ja: Das heißt, daß Ihr in Grenzfällen solche Ergebnisse wie "zu 32% rot" erhält. Ein solcher Algorithmus wäre zu verallgemeinern, denn wenn ein Ton zu 32% rot, zu 1% grün, 22% gelb und zu 28% blau ist, könnte man ihn wohl zu "rot" zählen, wenn da nicht die Helligkeit und die Sättigung wäre, denn niedrige Werte in diesem Bereich machen ein Braun und hohe ein Rosa, eventuell bis Weiß (Helligeit 100%, egal was da sonst noch kommt).
@DanDanger (http://www.coding-board.de/board/member.php?u=3617)
irgentwie kennen wir uns doch woher :D
als alter mathe-leistungskursler versteh ich dein vorgehen sehr gut und finde es einfach super.
werde versuchen es in die tat umzusetzen.
achja das mit der prozentualen angabe von rot grün und blau ist meines erachten sinnlos, da das ja schon rgb macht. zwar nicht von 0 bis einschließlig 100 aber von 0 bis ein. 255 und von daher für mich unbrauchbar.
ein großes dankeschön an alle die sich den kopf zerbrochen haben.
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.