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

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
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....

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
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