Variations de couleur minime d'un pixel ?

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
nograd
Niveau 1
Niveau 1
Messages : 6
Enregistré le : jeu. 23 févr. 2017 01:16
Status : Hors ligne

Variations de couleur minime d'un pixel ?

#1

Message par nograd »

Bonjour !

Je suis venu hier, mais je reviens aujourd'hui pour (encore), trouver réponse à ma question qui me bloque la route :x
Existe-t-il une fonction, ou peut-on faire en sorte que même si un pixel change de quelques teintes, le programme s’exécute tout de même ?

Si par exemple le Rouge est plus élevé de 3-4, ou pour le Bleu, le Vert, sans que j'ai à ne rentrer une par une ses différentes teintes, qui représente énormément de "couleurs" différentes mais juste à définir un seuil de "tolérance?" où le programme continuera même si il y a une petite variation de la couleur hexadécimal.

J'espère qu'une personne viendra à mon secours,
Merci encore ! :D
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#2

Message par TommyDDR »

Bonjour,

Avez-vous plus de détails concernant votre programme ? Nous ne sommes malheureusement pas devins, nous ne savons pas quelles fonctions vous utilisez et sans cela, nous ne pourrons vous aider sans faire de spéculation (qui est, dans la plupart des cas, une perte de temps pour ceux qui veulent vous aider).
Le mieux est de poster un code fonctionnel reproduisant votre problème ;)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
nograd
Niveau 1
Niveau 1
Messages : 6
Enregistré le : jeu. 23 févr. 2017 01:16
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#3

Message par nograd »

Bien sûr cela va de soit :D

Code : Tout sélectionner

Clique(409,110,"397C64")
	
Func Clique($pos1,$pos2,$Hexa)
	
	$CliqueColor = PixelGetColor($pos1, $pos2)
	$Color = Hex(CliqueColor, 6)

	If $Color = $Hexa Then

		MouseClick("left",$pos1, $pos2, 1) 
		sleep(500)
		
		While $Color = $Hexa 
			MouseMove(0,0,1)
			sleep(500)	
			$CliqueColor= PixelGetColor($pos1, $pos2)
			$Color = Hex($CliqueColor, 6)
		WEnd
	EndIf
EndFunc
	

	
Tant que la couleur ne change pas, la fonction ne se termine pas. Dans la fonction, quand je l'appelle "397C64" est la couleur en Hexadécimal, et justement j'aimerais que $Hexa prenne des valeurs comprises entre différentes teintes de celle-ci :)

Merci d'avoir répond aussi vite :wink:
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#4

Message par mdanielm »

Bonjour,
Je suggère de remplacer la condition:
$Color = $Hexa
par une condition de la forme:
distance(M, A) < rayon
Je m'explique:
-les couleurs sont modélisées par un cube de coté 256 (de 0 à 255)
- A est le point de coordonnée $Hexa, centre de la boule
- M est le point de coordonnées $Color
- rayon est la distance maximale à laquelle M peut s'écarter de A
- distance est une distance de l'espace: il y en a une infinité, celle qui fait les boules cubiques est:
d(M,N) = max(|XM-XN|, |YM-YN|, |ZM-ZN|)

A toi de jouer!
nograd
Niveau 1
Niveau 1
Messages : 6
Enregistré le : jeu. 23 févr. 2017 01:16
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#5

Message par nograd »

Bonjour,
Tout d'abord merci de votre aide, je vois ce que vous voulez dire néanmoins je ne vois pas "rayon est la distance maximale à laquelle M peut s'écarter de A", c'est égale à la différence de teintes maximum ?
Je ne vois pas comment réaliser ceci non plus "d(M,N) = max(|XM-XN|, |YM-YN|, |ZM-ZN|)" et je ne sais pas si j'ai un niveau assez haut pour réaliser cela :?
nograd
Niveau 1
Niveau 1
Messages : 6
Enregistré le : jeu. 23 févr. 2017 01:16
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#6

Message par nograd »

Est-ce qu'il est possible de faire cela par exemple avec PixelSearch "d'analyer ce pixel" avec shade-variations (si la couleur est proche de celle indiqué à l'origine) et si elle est que cela continue la fonction ?
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#7

Message par walkson »

Bonsoir,
J'ai deux suggestions à proposer. Soit:
Clique(600,410,"FFFED8","FFFFFF")
Func Clique($pos1,$pos2,$HexaMini,$HexaMaxi)

   $CliqueColor = PixelGetColor($pos1, $pos2)
   $Color = Hex($CliqueColor, 6)
ConsoleWrite($Color & @CR)

   If $Color >= $HexaMini And $Color <= $HexaMaxi Then

      MouseClick("left",$pos1, $pos2, 1)
      sleep(500)

      While $Color >= $HexaMini And $Color <= $HexaMaxi
        ; MouseMove(0,0,1)
         sleep(500)
         $CliqueColor= PixelGetColor($pos1, $pos2)
         $Color = Hex($CliqueColor, 6)
       ConsoleWrite($Color & @CR)
      WEnd
   EndIf
EndFunc

Ou bien ceci:
Clique1(600,410,"FFFFD8")
Func Clique($pos1,$pos2,$Hexa)

   $CliqueColor = PixelGetColor($pos1, $pos2)
   $Color = Hex($CliqueColor, 6)
ConsoleWrite($Color & @CR)
$decA = Dec($Hexa)
If $decA - 39 > 0 Then ;Dec(0x000000) = 0
$HexaMini = Hex($decA - 39,6)
Else
$HexaMini = "0x000000"
EndIf
If $decA + 39 < 376926741 Then ;Dec(0xFFFFFF) = 376926741
$HexaMaxi = Hex($decA + 39 ,6)
Else
$HexaMaxi = "0xFFFFFF"
EndIf
ConsoleWrite($HexaMini &">>"& $HexaMaxi & @CR)
   If $Color >= $HexaMini And $Color <= $HexaMaxi Then

      MouseClick("left",$pos1, $pos2, 1)
      sleep(500)

      While $Color >= $HexaMini And $Color <= $HexaMaxi
        ; MouseMove(0,0,1)
         sleep(500)
         $CliqueColor= PixelGetColor($pos1, $pos2)
         $Color = Hex($CliqueColor, 6)
       ConsoleWrite($Color & @CR)
      WEnd
   EndIf
EndFunc
La valeur 39 est à choisir dans la tolérance des tons (ex: + 260 passe du blanc au jaune pâle)
A noter qu'il ne faut pas être en dessous de 0 (noir) et au dessus de 376926741 (blanc)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#8

Message par TommyDDR »

@walkson : votre solution ne peut marcher, en effet, si c'est la composante rouge qui varie ne serai-ce que d'une teinte, votre script ne fonctionnera pas.
Ce qu'il faut faire, c'est de décomposer votre couleur en 3 composante, de comparer chaque composantes entre elles, d’additionner les valeurs absolues entre elle, cela vous donnera l'écart entre les deux
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#9

Message par walkson »

Oui! en effet ma proposition était complètement foireuse... :oops:
Bon! je remets mon bonnet d'âne et mordiller ma botte de foin...
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#10

Message par orax »

nograd a écrit :Est-ce qu'il est possible de faire cela par exemple avec PixelSearch "d'analyer ce pixel" avec shade-variations (si la couleur est proche de celle indiqué à l'origine) et si elle est que cela continue la fonction ?
Je pense que oui (à vérifier).

Une autre suggestion. J'ai utilisé la fonction Abs pour toujours avoir des nombres positifs dans les additions. Abs(-1) retourne 1.
; différence totale entre les couleurs 0x017FF0 et 0x037EFF = 18
; rouge = 2
; bleu  = 1
; vert  = 15
$pixelColor1 = 0x017FF0 ; 01 7F F0
$pixelColor2 = 0x037EFF ; 03 7E FF

; récupère les composantes des deux couleurs

$r1 = BitShift($pixelColor1, 16)
$g1 = BitShift(BitAND($pixelColor1, 0xFF00), 8)
$b1 = BitAND($pixelColor1, 0xFF)

$r2 = BitShift($pixelColor2, 16)
$g2 = BitShift(BitAND($pixelColor2, 0xFF00), 8)
$b2 = BitAND($pixelColor2, 0xFF)

$totalDiff = Abs($r1 - $r2) + Abs($g1 - $g2) + Abs($b1 - $b2) ; additionne les différences
ConsoleWrite($totalDiff & @CRLF)
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#11

Message par mdanielm »

Deux remarques, Orax:

1- La fonction _ColorGetRGB facilite les choses;
2- Je préfère mesurer la distance entre deux couleurs avec la 'formule':
d(M,N) = _max( abs(XM-XN), abs(YM-YN), abs(ZM-ZN) )

En effet, avec cette dernière distance les boules sont des cubes dont les cotés sont parallèles aux axes, comme le cube des couleurs.
Pour t'en persuader, colorie dans le plan, ( boule de centre O et de rayon 1)
1- l'ensemble des points M(x,y) tels que max(|x|, |y|) < 1
2- l'ensemble des points M(x,y) tels que |x| + |y| < 1

Ceci dit, pour approcher un point, n'importe quelle distance convient, y compris:
d(M,N) = sqrt( (XM-XN)² + (YM-YN)² + (ZM-ZN)² )

Pour d'autres problèmes c'est moins sûr!
Cordialement.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#12

Message par mikell »

nograd a écrit :Est-ce qu'il est possible de faire cela par exemple avec PixelSearch "d'analyer ce pixel" avec shade-variations (si la couleur est proche de celle indiqué à l'origine) et si elle est que cela continue la fonction ?
Pourquoi pas ? aucune raison que ça marche pas ^^

Code : Tout sélectionner

$x = 490
$y = 110
$aCoord = PixelSearch($x, $y, $x+1, $y+1, 0x397C64, 10)
If Not @error Then 
   ; le pixel a la même couleur (tolérance 10)
Else
   ; couleur change
EndIf
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#13

Message par orax »

Merci mdanielm pour ces remarques. J'avais oublié l'existence de la fonction _ColorGetRGB. Pour le calcul, je viens de faire quelques recherches sur internet, mais j'ai peur que mon niveau en mathématiques soit bien trop faible. :oops:
J'ai essayé la formule ci-dessous, mais je ne sais pas si elle est correcte.
Sqrt(($r2 - $r1) ^ 2 + ($g2 - $g1) ^ 2 + ($b2 - $b1) ^ 2)
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Variations de couleur minime d'un pixel ?

#14

Message par mdanielm »

Oui, elle est correcte, c'est la distance entre deux points de l'espace:
MN = sqrt( (xM-xN)² + (yM-yN)² + (zM-zN)² )

c'est la méthode usuelle, pour laquelle l'ensemble des points M tel que AM=1 est la sphère de centre A et de rayon 1.

Pour les couleurs, si tu veux tester la proximité d'une couleur r,v,b d'une couleur r0,v0,b0 tu pourrais tester par exemple:
r0-10 < r < r0+10 ET v0-10 < v < v0+10 ET b0-10 < b < b0+10

Ce qui revient à tester si r,v,b est dans le cube de centre r0,v0,b0 et de coté 20.

Ces conditions s'écrivent plus simplement:
max ( abs(r-r0), abs(v-v0), abs(b-b0) ) < 10

Très utile pour subdiviser le cube des couleurs en plusieurs petits cubes, par exemple.
Bonsoir
Répondre