Page 1 sur 1

[..] Prendre toutes les teintes d'une couleur

Posté : lun. 17 oct. 2011 19:09
par Utilisateur 3643 supprimé
Re-bonjour
je voulais savoir comment faire pour que mon programme réagisse à toute les formes de rouges

Code : Tout sélectionner

Local $mousePos
while 1
    $mousePos=MouseGetPos()
    Switch PixelGetColor($mousePos[0],$mousePos[1])
        Case 0xFF0000
            SplashTextOn("","bonjour")
            SplashOff()
    EndSwitch
wend
Je voudrait que mon script réagisse à toutes (ou presque) les teintes de rouge mais sans avoir à TOUTE les marquées

c'est Possible ?

merci d'avance

Re: [..] prendre toute les teintes d'une couleur

Posté : lun. 17 oct. 2011 20:10
par Strofe
Bonsoir

http://www.ecse.rpi.edu/~schubert/Light ... (Gage).jpg

La couleur Rouge :

; Longueur d'onde = ~ 625-740
; Fréquence = 480-405
; Longueur d'onde dans le vide (nm) = ~ 625-740
; Fréquence (THz) = 480-405
; Énergie de photon (eV) = ~ 1.6 - 2.0

Une bonne piste..

Reste à
1°) Définir la zone de couleur Rouge
2°) Convertir le RVB et le vérifier avec la zone.

A voir Rec.709

Bon courage :wink:

Re: [..] prendre toute les teintes d'une couleur

Posté : lun. 17 oct. 2011 23:20
par mikell
Pas clair ça, va déjà falloir commencer par définir ce que tu entends par "toutes (ou presque) les teintes de rouge"
FF c'est le maximum pour une couleur, mais FF0000 = rouge et FFFF00 = jaune citron
Pas facile ton histoire :wink:

Bon je blague, essaie ça

Code : Tout sélectionner

while 1
    $mousePos=MouseGetPos()
    $x = $mousePos[0]
    $y = $mousePos[1]
    PixelSearch($x, $y, $x+1, $y+1, 0xFF0000, [b]50[/b])  [color=#008000]; <= là tu dois tester différentes valeurs[/color]
    If Not @error Then ExitLoop
wend
Msgbox(0,"", "j'en ai trouvé un")

Re: [..] prendre toute les teintes d'une couleur

Posté : ven. 21 oct. 2011 22:10
par zeshrek
Je ne sais pas si c'est toujours d'actualité comme question, mais je propose ceci :

Code : Tout sélectionner

While 1
    $mousePos = MouseGetPos()
    $x = $mousePos[0]
    $y = $mousePos[1]
    $col = StringRight("000000" & Hex(PixelGetColor($x, $y)), 6)
    $rouge = Dec(StringMid($col, 1, 2))
    $vert = Dec(StringMid($col, 3, 2))
    $bleu = Dec(StringMid($col, 5, 2))
    If BitAND($rouge > $vert, $rouge > $bleu) Then
        MsgBox(0, "", "pixel rouge trouvé")
        ExitLoop
    EndIf
WEnd
Tout ce passe dans le bitand
La definition que j'ai pris pour rouge est que la composante rouge doit etre strictement supperieure chacune des deux autres couleurs.

Tu peux bien entendu modifier et/ou enrichir les criteres qui définissent qu'une couleur est 'rouge'

Re: [..] prendre toute les teintes d'une couleur

Posté : ven. 21 oct. 2011 22:38
par mikell
Heureusement qu'on peut modifier les critères, ake sinon FFFE00 serait rouge.... Image

Re: [..] prendre toute les teintes d'une couleur

Posté : sam. 22 oct. 2011 03:07
par zeshrek
Pfff... c'était juste un indice pour le mettre sur la voie
Du coup je me suis fait la conversion pour retrouver le 'hue' (N° de teinte) correspondant au RVB du pixel sur la roue chromatique

Code : Tout sélectionner

#include <Array.au3>

While 1
    $mousePos = MouseGetPos()
    $x = $mousePos[0]
    $y = $mousePos[1]
    $col = StringRight("000000" & Hex(PixelGetColor($x, $y)), 6)
    $rouge = Dec(StringMid($col, 1, 2))
    $vert = Dec(StringMid($col, 3, 2))
    $bleu = Dec(StringMid($col, 5, 2))
    Local $RVB[3] = [$rouge, $vert, $bleu]
    If BitAND($rouge > $vert, $rouge > $bleu) Then
        _ArraySort($RVB, 1)
        $Hue = Mod(60 * ($vert - $bleu) / ($RVB[0] - $RVB[2]) + 360, 360) ; formule de conversion RVB vers le H de HSV du cercle chromatique (pour afiner la detection des rouges, et éviter les pixels trop noirs, gris ou trop blancs, ol faut aussi mettre les formules pour trouver le S (saturation) et le V (Value).
        If $Hue < 40 Or $Hue > 320 Then ; J'ai arbitraierment défini le rouge comme les valeurs comprises entre -40 (320) et +40 degrés sur le cercle chromatique
            MsgBox(0, "", "pixel rouge trouvé"&@crlf&"Couleur RVB = "&$col&@crlf&"Teinte (Hue) = "&$Hue)
            ExitLoop
        EndIf
    EndIf
WEnd
Je n'ai pas pris en compte la saturation (qui va de la couleur au blanc) ni la valeur (qui va du noir a la couleur), mais il est possible d'ajouter les formules pour éviter les couleurs titant trop vers le gris, le blanc ou le noir

Re: [..] prendre toute les teintes d'une couleur

Posté : sam. 22 oct. 2011 11:15
par mikell
Eh ben voilà... celui-là, je le mets de côté, merci :mrgreen:

BTW j'aimerais bien savoir comment fonctionne le test de "shade variation" dans la fonction PixelSearch, impossible de trouver ça :?

Re: [..] Prendre toutes les teintes d'une couleur

Posté : sam. 22 oct. 2011 23:34
par zeshrek
Pour ton histoire de shade variation, tu dois pouvoir gerer ca par toi même en exploitant les formules de Saturation et/ou de Value

Code : Tout sélectionner

#include <Array.au3>

While 1
    $mousePos = MouseGetPos()
    $x = $mousePos[0]
    $y = $mousePos[1]
    $col = StringRight("000000" & Hex(PixelGetColor($x, $y)), 6)
    $rouge = Dec(StringMid($col, 1, 2))
    $vert = Dec(StringMid($col, 3, 2))
    $bleu = Dec(StringMid($col, 5, 2))
    Local $RVB[3] = [$rouge, $vert, $bleu]
    If BitAND($rouge > $vert, $rouge > $bleu) Then
        _ArraySort($RVB, 1)
        $Hue = Mod(60 * ($vert - $bleu) / ($RVB[0] - $RVB[2]) + 360, 360) ; formule de conversion RVB vers HSV du cercle chromatique
        If $RVB[0] = 0 Then
            $Saturation = 0
        Else
            $Saturation = 1 - $RVB[2] / $RVB[0]
        EndIf
        $Value = $RVB[0]
        If BitAND(BitOR($Hue < 40, $Hue > 320), $Saturation > 0.2, $Value > .2) Then
            ; J'ai arbitraierment défini le rouge comme les valeurs comprises entre -40 (320) et +40 degrés sur le cercle chromatique (donc 360 degrés)
            ; Coté saturation elles doivent etre >0.2 (pour une saturation possible entre 0 et 1) pour éviter les teintes trop délavées (0 étant la désaturation totale et 1 étant la saturation totale, donc la couleur 'naturelle')
            ; et la value (qu'on pourrait appeler la luminosité)  pot etre >0.2 (pour une saturation possible entre 0 et 1) pour éviter les teintes trop sombres (0 étant l'absence de luminosité et 1 la couleur non a sa luminosité 'naturelle')
            MsgBox(0, "", "pixel rouge trouvé" & @CRLF & "Couleur RVB = " & $col & @CRLF & "Teinte (Hue) = " & $Hue)
            ExitLoop
        EndIf
    EndIf
WEnd
Bon, j'arrete avec la colorimétrie pour ce WE ;)

Shade