2012-01-30 12 views
8

Sto sviluppando un'applicazione iOS in cui l'utente può modificare una parte del colore dell'immagine, ad esempio una tazza da tè, toccandola. Sto usando l'algoritmo Floodfill per riempire i colori in modo che l'utente debba toccare la tazza da tè per cambiarne il colore. Funziona bene. Ma il colore finale sembra leggermente diverso dal colore di sostituzione. Ho qualche problema a trovare una logica migliore per convertire il colore dell'oggetto (Tea Cup) nel colore selezionato considerando la sua saturazione & luminosità.Migliore logica/algoritmo colorazione immagine

Sto utilizzando la seguente logica per ottenere il colore del risultato. Sto rappresentando il colore come (tonalità, saturazione, valore).

touchedColor = (tchd_h, tchd_s, tchd_v); // I am not using this now 

pixelColor = (old_h, old_s, old_v); 
replacementColor = (new_h, new_s, new_v); 
resultColor = (new_h, new_s, old_v); 
pixelColor = resultColor; 

La coppa prima della verniciatura (cerchiato in rosso).

enter image description here

Il ReplacementColor selezionato.

enter image description here

Cup dopo la pittura ReplacementColor (cerchiato in rosso).

enter image description here

vedere l'immagine finale di cui sopra. Come sto solo cambiando solo il tonalità & saturazione, e non il valore di del pixelColor, il colore applicato non sembra simile a quello selezionato ReplacementColor. La luminosità dell'immagine rimane inalterata.

Se cambio il valore insieme tonalità & saturazione come questo,

resultColor = (new_h, new_s, new_v); 
pixelColor = resultColor; 

Poi la coppa diventa piatta di colore, mancano le luci & tonalità come questo,

enter image description here

Desidero qualche idea di modificare la logica precedente per modificare il colore dei pixel in un colore sostitutivo corrispondente. Può essere una formula per derivare il valore saturazione & valore.

+0

Forse mostraci un esempio di ciò che pensi sia sbagliato? Non riesco a vedere un problema con la premessa di base. –

+0

@Mark Ransom, Sì, ho aggiornato la mia domanda con le immagini. – EmptyStack

risposta

3

Nel tuo esempio, chiamiamo il colore rosa "Colore da sostituire" e chiamiamo il colore marrone "Colore di sostituzione". Per ogni pixel nella destinazione, trova il pixel corrispondente nella sorgente. Guarda come varia dal "Colore da sostituire". Ora apporta le stesse modifiche al "Colore di sostituzione" e usalo come colore al pixel di uscita corrente.

Ad esempio, se il pixel di origine corrente è più scuro del colore da sostituire con 5 unità "v", impostare il pixel di uscita sul colore sostitutivo reso più scuro di 5 unità "v". (E vorresti fare le stesse regolazioni anche in tonalità e saturazione)

Probabilmente dovrai limitare l'intervallo di colori che hai regolato in modo da non trasformare altri oggetti di un colore diverso.

+0

Grazie per la risposta. Posso capire quello che stai dicendo. Non so come implementarlo in tempo reale. Puoi mostrarmi qualche pseudo codice o qualcosa del genere? Sto lottando per implementarlo per più di un mese. – EmptyStack

+0

Per farlo in tempo reale, si potrebbe provare a scrivere uno shader OpenGL in glsl. Un algoritmo di pseudo-codice di base sarebbe simile a questo: 'pixelColor = (old_h, old_s, old_v); pixelDiff = (touched_h - old_h, touched_s - old_s, touched_v - old_v); resultColor = (new_h - pixelDiff.h, new_s - pixelDiff.s, new_v - pixelDiff.v); ' – user1118321

+0

Calcolando il risultatoColore basato sul colore toccato non fornisce un'uscita uniforme in quanto il colore della vettura non è un colore pieno. Ad esempio, se tocchi un colore scuro nell'automobile, esso dà l'output in una variante, e se seleziono un colore chiaro nell'auto, l'uscita è in una variante diversa. – EmptyStack

Problemi correlati