Bonjour,
Le nombre de sujets abordés dans le dernier message m'a conduit à répondre brièvement, et parfois d'une manière beaucoup trop rapide; il n'est donc pas étonnant que certains résultats t'aient paru franchement parachutés.
Je reviens sur quelques points particuliers.
1°) La
conversion (r, v, b)/entier long: le codage des couleurs, initialement représentées par un triplet de Bytes (r, v, b), peut se réduire à un entier unique de type LongInt donné par la combinaison linéaire (0):
N = r + (256 * v) + (2562 * b) .
De cette relation de définition, on peut en déduire trois autres, qui n'en diffèrent que par la présentation:
(1) N = r + 256 * (v + (256 * b))
(2) N = (r + (256 * v)) + (256
2) * b
(3) N - r = 256 * (v + (256 * b))
mais montrent comment remonter aux trois indices de couleur par des divisions euclidiennes:
(1') r = N MOD 256 // reste de la d.e. de N par 256
(2') b = N DIV (256
2) // quotient de la d.e. de N par 256
2 = 65536
(3') (N - r) DIV 256 = v + (256 * b) d'où le dernier résultat: (3") v = ((N - r) DIV 256) - (256 * b)
Ces résultats se traduisent en Pascal par les 4 instructions suivantes:
1 2
| r:= N MOD B1; b:= N DIV B2; // avec B1 = 256 et B2 = B1 * B1
v:= (N - r) DIV B1; Dec(v, B1 * b); |
2°) Repérer des
couleurs proches d'une couleur donnée revient à définir l'écart entre deux triplets d'entiers (r, v, b) et (R
0, V
0, B
0) - valeur de référence.
a) On conviendra que deux couleurs sont apparentées si les écarts entre les indices correspondants ne dépassent pas en valeur absolue une limite convenue, par exemple:
# |r - R
0| < E
r
# |v - V
0| < E
v
# |b - B
0| < E
b
conditions équivalentes aux suivantes (nettement plus lourdes au codage, je le vois maintenant):
# (R
0 - E
r) < r < (R
0 + E
r)
# (V
0 - E
v) < v < (V
0 + E
v)
# (B
0 - E
b) < b < (B
0 + E
b)
Ces conditions se traduiront en Pascal par:
1 2 3 4
| TestR:= (Abs(r - R0) < Er);
TestV:= (Abs(v - V0) < Ev);
TestB:= (Abs(b - B0) < Eb);
Test:= (TestR AND (TestV AND TestB)); // Test (1) de couleurs "proches" |
instructions qui remplaceront avantageusement ce qui avait été rapidement proposé:
TestR:= ((R1<r) AND (r<R2)); // etc ... 6 constantes à définir! R1, R2, V1, V2, Bl1, Bl2
b) Une autre méthode consiste à évaluer la distance séparant les deux triplets d'entiers par la somme des valeurs absolues des écarts (
distance de Manhattan):
D = |r - R
0| + |v - V
0| + |b - B
0| .
Le test de proximité des couleurs (D < D
max) est plus souple, dans la mesure où il autorise une compensation des écarts; il se traduit par les instructions:
1 2
| d:= Abs(r - R0); Inc(d, Abs(v - V0));
Inc(d, Abs(b - B0)); Test:= (d < Dmax); // Test (2) de couleurs "proches" |
Partager