Come evitare le bande di colore prominente nei gradienti?


13

Quindi questa è una visualizzazione più scientifica della grafica, ma penso che la teoria sia la stessa. Nelle mappe dei colori utilizzate per visualizzare i dati, ci sono spesso bande di colore che sporgono quando non dovrebbero. Credo che siano una forma di bande Mach ?

Ad esempio, ho usato questa mappa colori bipolare e produce immagini come questa:

inserisci qui la descrizione dell'immagine

È quasi come un anello di neon arancione intorno a 0,2 e uno simile per il blu intorno a -0,2. Ecco un grafico dei componenti RGB e un calcolo della luminanza relativa in nero:

inserisci qui la descrizione dell'immagine

L'ho modificato manualmente per cercare di sbarazzarmi delle band, e in qualche modo ci sono riuscito, ma non capisco davvero la teoria alla base:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

È meglio, ma ci vedo ancora delle band.

Per un altro esempio, per la mappa dei colori a caldo, ho pensato che forse avrei dovuto linearizzare il diagramma di luminanza per evitare il banding, ma non ha funzionato davvero:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Le bande gialle e arancioni sono ancora lì, sono appena spostate e macchiate un po '. Quindi le discontinuità nel diagramma della luminanza non sono la causa del problema.

Come faccio a passare senza problemi attraverso i colori senza bande? Esistono regole per creare curve morbide attraverso lo spazio colore Lab o qualcosa del genere? ( Modifica: Ooh, ho trovato un esempio per questo : "La scala dei colori è calcolata usando lo spazio colore L a b *. Segue una rampa uniforme lungo la direzione L * e segue un percorso semicircolare nella a * -b * aereo.")

Aggiornamento: ecco un grafico di questa mappa di colori nel cubo RGB, che mostra gli angoli acuti di cui parla l'utente568458:

inserisci qui la descrizione dell'immagine


1
nota, ho fatto un commento sulle bande percettive (sotto), ma questo è stato prima di esaminare davvero la domanda. Vedo che stai parlando di come si distinguono due gamme di colori particolari.
horatio,

1
Bel diagramma! Questo è esattamente ciò che intendo per angoli acuti, immaginavo un cubo di colore come questo o come questo . Ho aggiunto un'illustrazione grezza ma, si spera, utile del tipo di cosa che intendo per la mia risposta. (ovviamente c'è anche la seconda coppia di spigoli vivi nei punti in cui il percorso rosso aggiunge il verde per raggiungere il bianco e dove il percorso blu aggiunge il rosso per raggiungere il bianco)
user56reinstatemonica8

Risposte:


6

Non dimenticare che, anche se stai lavorando con i valori di colore LAB, i valori RGB devono essere emessi per mostrarlo su uno schermo. Ad un certo punto, deve dire ai pixel rosso, verde e blu di uno schermo cosa fare.

Guardalo in termini RGB e la causa delle bande è in realtà piuttosto semplice.

Prendi un selettore di colori e osserva i gradienti e noterai che le bande si trovano attorno ai punti in cui la natura del gradiente cambia:

  • In rosso, è intorno a dove passa dall'aumentare uniformemente la R nell'RGB all'aggiunta di G per diventare gialla - intorno a # FF0000 a # FF2500
  • Nel blu, è intorno a dove passa dall'aumentare uniformemente la B nell'RGB all'aggiunta di G per diventare ciano - intorno a # 0000FF a # 0025FF

E allo stesso modo con le trame inferiori, aggiungendo il giallo al bianco: sono essenzialmente tre gradienti uniti. Usando il gradiente rosso come esempio:

  • è da # 000000 a # FF0000 (aumento della luminosità in termini di HSB, aumento del canale rosso in RGB)
  • quindi da # FF0000 a # FFFF00 (cambiando tonalità in termini HSB, aumentando il canale verde in RGB)
  • quindi da # FFFF00 a #FFFFFF (modifica della saturazione in termini di HSB, aumento del canale blu in RGB)

inserisci qui la descrizione dell'immagine

Quindi ci sarà sempre un join visibile, se è così che viene impostato. Come regola generale, dove l'accuratezza e la linearità sono l'obiettivo principale, è meglio mantenere un gradiente semplice, variando costantemente una caratteristica (a meno che non si desideri eseguire il bendaggio, ad esempio su alcuni tipi di scansione del cervello).


Detto questo , se sei determinato a correre attraverso lo spettro più ampio (sembra buono), esaminerei o cominciando ad aggiungere il secondo canale prima che il primo sia completo, formando una sezione ponte tra i gradienti o avendo un leggera curva a forma di S inversa alla velocità con cui viene aggiunto il secondo canale (probabilmente entrambi).

Quindi invece di:

  • Da 000000 a # FF0000, da 100% nero a 100% rosso

  • Da FF0000 a # FFFF00, da 100% rosso a 100% giallo

  • Da FFFF00 a #FFFFFF, da 100% giallo a 100% bianco

... potrebbe essere (solo indovinando dalla parte superiore della mia testa, sarà necessario un aggiustamento):

  • Da 000000 a # E90000, da 100% nero a rosso vivo

  • Da E90000 a # FF2500, (PONTE CORTO) da rosso vivo (scuro) a rosso vivo (leggermente arancione)

  • Da FF2500 a # FFE900, da rosso brillante (leggermente arancione) a giallo brillante (leggermente arancione)

  • Da FFE900 a # FFFF25, (PONTE CORTO) da giallo brillante (leggermente arancione) a giallo brillante (chiaro)

  • Da FFFF25 a #FFFFFF, da giallo brillante (chiaro) a 100% bianco

... quindi regola le curve di ogni sezione in base ai gusti :-)


Modifica: ecco una dimostrazione del suggerimento "tagliare gli angoli". Non è perfetto - è abbastanza non raffinato, solo qualcosa che ho messo insieme a occhio in pochi minuti usando lo strumento di fusione Illustrator (oggetti non piegati in basso per mostrare i punti di colore). Ogni segmento del gradiente tra ciascun punto di colore è lineare al 100%, mentre probabilmente vorrai qualcosa di più arrotondato e, di conseguenza, se osservi attentamente puoi individuare le bande.

I risultati variano naturalmente tra i monitor: sul mio monitor "buono", è fluido; sul monitor "cattivo" che utilizzo per controllare la resilienza delle immagini web (dove le bande originali non vengono visualizzate in modo molto chiaro), le arance appaiono sempre attenuate facendo apparire le api rosse e gialle più luminose dell'arancia unita, enfatizzando troppo il rosso e aree gialle - ma puoi ancora vedere che il "bordo" delle bande originali è in gran parte sparito.

Ad ogni modo, rispetto ai gradienti originali, puoi vedere chiaramente la differenza. (per quanto riguarda la matematica dietro questo - nessuna idea, non sono un matematico, ma spero che questo aiuti a identificare il problema e la soluzione)

inserisci qui la descrizione dell'immagine

L'altro vantaggio è che sei libero di usare il nero più chiaro> transizione di un canale in più.


O la stessa idea su un cubo di colore RGB (perdona la rozzazza, è inteso per essere dimostrativo non accurato ...):

inserisci qui la descrizione dell'immagine

Ciò mostra probabilmente più chiaramente cosa intendevo quando ho detto che il gradiente di esempio può essere migliorato rendendo le transizioni dai segmenti principali a segmenti angolari più lisce piuttosto che angolari.


così tldr; evitare i valori di 255 per i canali R, G, B (?)
horatio

2
@horatio non proprio no, più come tldr; evitare angoli acuti tra le sezioni di un gradiente
user56reinstatemonica8

Tutto dipende dallo spazio colore utilizzato per l'output: vedresti le stesse bande nel design della stampa se avessi una sfumatura che andava, ad esempio, dal bianco puro al magenta puro al viola puro (100% magenta e ciano) al nero puro ( realizzato al 100% in C, m, k)
user56reinstatemonica8

Più come "evitare gli angoli acuti mentre ci si sposta nello spazio HSB"? Ma se provo a fare un'interpolazione cubica o qualcosa del genere, finisco per andare fuori dallo spazio HSB, che quindi ritaglia i valori e causa comunque cose cattive. Nel mio secondo esempio, sto facendo quello che mi consigliate sull'aggiunta di sezioni ponte, ma non funziona perfettamente. Sembra ancora una macchia di giallo all'interno di una macchia di rosso-arancio con un alone attorno ad esso, invece di un cambiamento di colore uniformemente variabile.
Endolith,

1
Ecco un tentativo utilizzando una curva di Bezier, invece: flic.kr/p/e1bcFf flic.kr/p/e15wik
endolith

1

Forse questo potrebbe aiutarti, funziona per me, ma non conosco un modo manuale per realizzarlo.

http://nomorebanding.com/


Questo non è lo stesso tipo di banding e il dithering non è possibile in questo contesto, comunque. Immagino che sto parlando di più sulle bande percettive in quello che dovrebbe essere un gradiente uniforme, mentre il tuo link riguarda le bande dovute alla quantizzazione dei colori?
endolith,

1
le bande percettive provengono dalla quantizzazione del colore. Si tratta di un problema con la rappresentazione a 8 bit per pixel. Non so nulla del plug-in, ma l'uso di 16bpp RGB durante la produzione di gradienti e il down-sampling a 8bpp produrrà risultati molto migliori con un banding molto inferiore rispetto alla creazione in 8bpp.
horatio,

@horatio: No, le bande provengono dalla curva e prendono spigoli vivi mentre si sposta attraverso lo spazio cromatico percettivo. Nello specifico, nel mio esempio, è il chroma che sta raggiungendo un picco in quegli angoli.
endolito il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.