Newsgroup: it.comp.programmare
Titolo: selezione automatica di colori giustapposti

Ho delle regioni colorate da visualizzare.
Vorrei che il colore fosse scelto automaticamente in modo da risultare il 
piu' contrastante possibile con le aree piu' vicine.
Il tutto dinamicamente, magari selezionanando da una tavolozza di 100 colori 
predefiniti.
Conoscete qualche algoritmo a riguardo, o direzione in cui guardare?

cicap ha scritto:


Mah...
Io comincerei col definire il contrasto tra due colori.
Due colori contrastanti li so riconoscere ad occhio, ma non mi e' mai
capitato di definirli dal punto di vista della programmazione.
Quindi partirei da questa cosa.
Una volta definita la funzione contrasto(c1, c2), e' possibile, dato un
colore del tuo array, trovare quelli piu' contrastanti con questo.
Poi, se la regione da colorare e' piana, c'e' il ben noto teorema dei 4
colori, che ci dice che di colori ne bastano 4.
Ma se tu devi usarli tutti allora bisogna fare un grafo per stabilire i
rapporti di contrasto che ogni colore ha con tutti gli altri, in modo da
poter poi pescare il colore piu' adeguato.
Potrebbe anche essere un procedimento senza soluzione perche' il vettore
dei colori non e' detto che contenga colori contrastanti.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 colori, che ci dice che di colori ne bastano 4.
Non credo che questo teorema faccia al caso mio. La regione  è piana ma non 
sono contigue per forza.
Pensavo a massimizzare una funzione. Ad esempio ho 3 regioni: A, B, C.
A dista da B di 3,  B dista C 100, A dista da C 2.
Conosco quindi i pesi degli archi del grafo A,B,C.
Devo assegnare dei valori (da 0 a 100) ai 3 vertici in modo che siano il 
piu' contrastanti possibile.
Ovvero massimizzare la funzione
contrasto(A, B) / 3  + contrasto(A, C) / 2  + contrasto(B, C) / 100
Ha senso? come si massimizza sta roba? 

 Ha senso? come si massimizza sta roba?
Qualunque cosa tu decida di fare, tieni presente che la percezione da 
parte nostra delle intensita' di colore e' nettamente asimmetrica (a 
sfavore del blu, e verde).
Se poi hai utenti daltonici (il che e' probabile) il problema non e' 
semplice.. in questi casi generalmente si associa la differenza di 
colore ad altre caratteristiche (texture, etc.)

 Ha senso? come si massimizza sta roba? 
Vediamo di rigirare il problema da un altro punto di vista.
Ipotizziamo che i tuoi 100 colori siano una scala di grigi.
0 e' il nero
100 e' il bianco
50 e' il grigio di mezzo.
In tal caso la soluzione ottimale per i tuoi tre vertici e' proprio 0, 
50, 100, in quanto i tre colori, presi a coppie, hanno un contrasto di 
50, 50, 100, definendo come contrasto il semplice valore assoluto della 
differenza dei colori. Essendo grigi si puo' fare.
Nel momento in cui pero' passi a 4 vertici come si puo' procedere?
Si puo' prendere sempre 0 e 100, e poi intuitivamente 33 e 66.
Ma non e' cosi' immediato dimostrare che sia la configurazione ottimale, 
e neppure sono sicuro che lo sia.
Aumentando il numero dei vertici le cose si complicano, perche' 
probabilmente possono entrare in gioco due colori che hanno tra di loro 
un contrasto quasi nullo, ma che se non vengono collocati uno accanto 
all'altro possono sussistere.
Non e' un problema facile.
Credo che si possa coinvolgere anche il gruppo it.hobby.enigmi almeno 
per quanto riguarda la determinazione del modo di procedere. Magari 
hanno qualche idea.

 
Grazie, provero' a coinvolgere altri gruppi di discussione.
Effettivamente massimizzare funzioni con molte variabili sembra 
difficile, almeno senza una qualche base matematica da cui partire.
Non e' che centra la Ricerca Operativa? Mi sembra un problema da RO, 
anche se purtroppo ormai non mi ricordo nulla di questa materia che non 
ho neppure studiato tanto bene ;)
A questo punto provero' anche con un gruppo di matematica.


Troverai sicuramente qualcosa a riguardo su un buon libro di
eleborazione delle immagini.
Comunque forse per te puo' bastare quello che viene consigliato dal
w3c per l'accessibilita':
riporto da 
http://www.w3.org/TR/AERT#color-contrast
<quote>
Color visibility can be determined according to the following
algorithm:
(This is a suggested algorithm that is still open to change.)
Two colors provide good color visibility if the brightness difference
and the color difference between the two colors are greater than a set
range.
Color brightness is determined by the following formula:
((Red value X 299) + (Green value X 587) + (Blue value X 114)) / 1000
Note: This algorithm is taken from a formula for converting RGB values
to YIQ values. This brightness value gives a perceived brightness for
a color.
Color difference is determined by the following formula:
(maximum (Red value 1, Red value 2) - minimum (Red value 1, Red value
2)) + (maximum (Green value 1, Green value 2) - minimum (Green value
1, Green value 2)) + (maximum (Blue value 1, Blue value 2) - minimum
(Blue value 1, Blue value 2))
The rage for color brightness difference is 125. The range for color
difference is 500.
</quote>
Saluti,
The Librarian