Deutsch
Forum

Erledigt: Farbunterschied ermitteln

 

KHR
Hallo miteinander,

ich suche eine Routine, mit der sich berechnen läßt, ob zwei Farben für unser Auge genug von einander abweichen, sagen wir genug Farbkontrast haben um deutliche Abgrenzug zu ermöglichen.

Als Beispiel habe ich hier einen Democode, der Rechtecke mit Zufallsfarben darstellt.

Meist weichen diese Farben kräftig von einander ab. Manchmal sind sie aber leider sehr verwandt.

Wie kann ich das im Programm-Ablauf erkennen, um z.B. die Zufallsfarbe neu berechnen zu lassen??
KompilierenMarkierenSeparieren
declare farbe&, size&
cls
randomize
size& = 210

while 1

    whileloop (size&/10/2)

        farbe& = @rgb(@rnd(256),@rnd(256),@rnd(256))
        usebrush 1,farbe&
        UsePen 5,0,farbe&
        rectangle   (&loop*10),(&loop*10) - (size&-(&loop*10)),(size&-(&loop*10))

    endwhile

    waitinput 400
    cls

endwhile


Ich hab diese Frage auch im anderen Forum gestellt um vielleicht ein breiteres Spektrum an Möglichkeiten zu bekommen.
 
Gruß
Karl-Heinz
WIN XP home/Pro / XPROFAN 11 / P2CPP
ATMEL + BASCOM Fan
14.03.2009  
 



Sowas?

Ähnlichkeit zu schwarz:
KompilierenMarkierenSeparieren
bzw.
KompilierenMarkierenSeparieren
proc FARBAEHNLICHKEIT

    PARAMETERS FARBE1&,FARBE2&
    RETURN (ABS(GETRVALUE(FARBE1&)-GETRVALUE(FARBE2&))+ABS(GETGVALUE(FARBE1&)-GETGVALUE(FARBE2&))+ABS(GETBVALUE(FARBE1&)-GETBVALUE(FARBE2&))) * 0.001307189542483660130718954248

endproc


Wie unser Auge wird hier jedoch nicht beachtet da unsere Augen RGB nicht linear erfassen sondern durchschnittlich eher nach Rot+Grün und Gelb(=Rot+Grün)+Blau und Helligkeit. (hierbei aber glaube ich nicht vordergründig)

Jedenfalls aber gibt diese Funktion nicht aus, dass Rot und Grün oder Blau und Rot gleich sind.

Die Ähnlichkeit zu weiss wäre gegeben, wenn der Rückgabewert 1-x genommen würde.
 
14.03.2009  
 




KHR
Hallo David

danke für Deine Lösung. Ich habs mal in die Fahrräder reingebastelt.
KompilierenMarkierenSeparieren
Fahrräder
by Karl-Heinz Rattay / 2009
einfach ausprobieren
Wems gefällt der kann ja einen screensaver draus machen!
Dieses Modul ist einfach so wie es ist. Wems nicht gefällt, der kann umstricken!!
declare  r&, g&, b&, diff&, mix&, lastmix&
declare Zaehler&

proc zeichne

    parameters c&,hpos%,vpos%, size%
    usepen   0,(size%/5),c&
    useBrush 0,c&
    ellipse (hpos%-(Size%/1.5)),(vpos%-(Size%/1.5)) - (hpos%+(Size%/1.5)),(vpos%+(Size%/1.5))
    ellipse ((hpos%+size%*2.0)-(Size%/1.5)),(vpos%-(Size%/1.5)) - ((hpos%+size%*2.0)+(Size%/1.5)),(vpos%+(Size%/1.5))
    usepen   0,(size%/8),c&
    moveto hpos%,vpos%
    lineto (hpos%+(size%/6)),(vpos% - (Size%*1.05))
    lineto (hpos%+(size%*1.7))   , (vpos% - (Size%*0.95) + (size%/6))
    lineto (hpos%+(size%*1.1))  , vpos%
    moveto (hpos%+(size%/4)),(vpos% - (Size%*1.3))
    lineto (hpos%+(size%/6)),(vpos% - (Size%*1.3))
    lineto (hpos%+(size%/6)),(vpos% - (Size%*1))
    lineto (hpos%+(size%*1.1))  , vpos%
    lineto (hpos%+(size%*2))  , vpos%
    lineto (hpos%+(size%*1.7))   , (vpos% - (Size%*1) + (size%/6))
    lineto (hpos%+(size%*1.7))   , (vpos% - (Size%*1) -(size%/7))
    moveto (hpos%+(size%*1.7)-(size%/5))   , (vpos% - (Size%*1.1) -(size%/8))
    lineto (hpos%+(size%*1.7)+(size%/5))   , (vpos% - (Size%*1.1) -(size%/8))
    moveto (hpos%+(size%*1.1))  , (vpos%-(size%*0.3))
    lineto (hpos%+(size%*1.1))  , (vpos%+(size%*0.3))

Endproc

proc FARBAEHNLICHKEIT

    PARAMETERS FARBE1&,FARBE2&
    RETURN (ABS(GETRVALUE(FARBE1&)-GETRVALUE(FARBE2&))+ABS(GETGVALUE(FARBE1&)-GETGVALUE(FARBE2&))+ABS(GETBVALUE(FARBE1&)-GETBVALUE(FARBE2&))) * 0.001307189542483660130718954248

endproc

cls
showmax
randomize

while 1

    inc zaehler&

    if zaehler& > 80

        while 1

            r&=Rnd(256)
            g&=Rnd(256)
            b&=Rnd(256)
            mix&=@rgb(r&,g&,b&)
            Case FARBAEHNLICHKEIT (lastmix&,mix&) :CONTINUE
            lastmix&=mix&
            BREAK

        endwhile

        zeichne  @rgb(r&,g&,b&) ,
        ((%maxx*0.6) + @rnd(%maxx/4)) ,
        (100+@rnd(@rnd(%maxy*0.85))) ,
        (15+@rnd(40))
        zaehler& = 1

    endif

    copyBmp 1,0 - %maxx,%maxy > 0,0;0
    case @IsKey(27) : end    ESC gedrückt

endwhile


Ich biete dazu als Vergleich die Lösung aus dem Nachbarforum an.
KompilierenMarkierenSeparieren
Fahrräder
by Karl-Heinz Rattay / 2009
einfach ausprobieren
Wems gefällt der kann ja einen screensaver draus machen!
Dieses Modul ist einfach so wie es ist. Wems nicht gefällt, der kann umstricken!!
declare  r&, g&, b&, diff&, mix&, lastmix&
declare Zaehler&

proc zeichne

    parameters c&,hpos%,vpos%, size%
    usepen   0,(size%/5),c&
    useBrush 0,c&
    ellipse (hpos%-(Size%/1.5)),(vpos%-(Size%/1.5)) - (hpos%+(Size%/1.5)),(vpos%+(Size%/1.5))
    ellipse ((hpos%+size%*2.0)-(Size%/1.5)),(vpos%-(Size%/1.5)) - ((hpos%+size%*2.0)+(Size%/1.5)),(vpos%+(Size%/1.5))
    usepen   0,(size%/8),c&
    moveto hpos%,vpos%
    lineto (hpos%+(size%/6)),(vpos% - (Size%*1.05))
    lineto (hpos%+(size%*1.7))   , (vpos% - (Size%*0.95) + (size%/6))
    lineto (hpos%+(size%*1.1))  , vpos%
    moveto (hpos%+(size%/4)),(vpos% - (Size%*1.3))
    lineto (hpos%+(size%/6)),(vpos% - (Size%*1.3))
    lineto (hpos%+(size%/6)),(vpos% - (Size%*1))
    lineto (hpos%+(size%*1.1))  , vpos%
    lineto (hpos%+(size%*2))  , vpos%
    lineto (hpos%+(size%*1.7))   , (vpos% - (Size%*1) + (size%/6))
    lineto (hpos%+(size%*1.7))   , (vpos% - (Size%*1) -(size%/7))
    moveto (hpos%+(size%*1.7)-(size%/5))   , (vpos% - (Size%*1.1) -(size%/8))
    lineto (hpos%+(size%*1.7)+(size%/5))   , (vpos% - (Size%*1.1) -(size%/8))
    moveto (hpos%+(size%*1.1))  , (vpos%-(size%*0.3))
    lineto (hpos%+(size%*1.1))  , (vpos%+(size%*0.3))

Endproc

cls
showmax
randomize

while 1

    inc zaehler&

    if zaehler& > 80

        while 1

            r&    = Rnd(256)
            g&    = Rnd(256)
            b&    = Rnd(256)
            mix&  =(r&+g&+b&)/3
            diff& = Abs(lastmix&-mix&)
            Case diff&<40   :  CONTINUE
            lastmix& = mix&
            BREAK

        endwhile

        zeichne  @rgb(r&,g&,b&) ,
        ((%maxx*0.6) + @rnd(%maxx/4)) ,
        (100+@rnd(@rnd(%maxy*0.85))) ,
        (15+@rnd(40))
        zaehler& = 1

    endif

    copyBmp 1,0 - %maxx,%maxy > 0,0;0
    case @IsKey(27) : end    ESC gedrückt

endwhile


Kann jemand Unterschiede in der Farbverteilung erkennen?

Ich glaube schon etwas erkannt zu haben, mit dem Ergebnis warte ich aber - vielleicht meldet sich ja auch jemand von Euch
 
Gruß
Karl-Heinz
WIN XP home/Pro / XPROFAN 11 / P2CPP
ATMEL + BASCOM Fan
14.03.2009  
 



Der Unterschied ist, dass der Algo r+g+b farbenblind ist. Ein rotes Pixel ist danach genauso wertig wie ein Grünes, was dann aber nichts mehr zu tun hat mit ob zwei Farben für unser Auge genug von einander abweichen.
 
14.03.2009  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.897 Betrachtungen

Unbenanntvor 0 min.
Torsten Boo29.07.2021
Michael W.03.07.2016
Julian Schmidt19.06.2013

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

iF (2x)
KHR (2x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie