2010-10-30 16 views
10

So che l'algoritmo Floyd–Steinberg dithering non può essere implementato con pixel shader, poiché tale algoritmo è strettamente sequenziale. Ma forse esiste un algoritmo di dithering ad alta parallela che dal suo output visivo è simile all'algoritmo di Floyd-Steinberg?Alternative di dithering Floyd-Steinberg per pixel shader

Quindi la domanda è: quali sono gli algoritmi di dithering adatti all'implementazione su pixel shader (preferibilmente GLSL) e con qualità di output (molto) simile al dithering di Floyd-Steinberg?

BTW. Gli algoritmi multi-pass sono consentiti fino a quando non ci sono più di 2 passaggi e l'overhead della CPU tra questi passaggi è piccola.

Qualche idea?

EDIT:
ho bisogno di dithering da colori a 24 bit per colore 21-bit.
(Che è -. Ho bisogno di convertire da 8 bit/canale da 7 bit/canale)

EDIT 2 Forse non ho spiegato problema molto bene. Quindi proverò ad espandermi un po 'sul problema esatto. problema è questo - considerare abbiamo questa immagine:
alt text
E abbiamo foto sopra, ma elaborati con algoritmo di dithering:
alt text
Ora, questa è la procedura che metterà alla prova il vostro dithering è un bene per me o no:
1. Caricare queste immagini in Photoshop come un'unica immagine con 2 livelli.
2. Scegliere la modalità di fusione Livelli su "Differenza".
3. Eseguire l'operazione "Unisci visibili" sui livelli per ottenere un solo livello.
4. Eseguire un'operazione => Immagine/Regolazioni/Equalize

Dopo di che è necessario ottenere tale immagine:
alt text
Come si vede - pixel medie che era di colore rosso monotono non era dithered affatto. Anche il dithering delle zone dell'immagine sinistra e destra è leggermente diverso. Prova a ricostruire l'algoritmo di dithering con tale comportamento.

+0

Non riesco a capire il risultato. L'immagine di differenza implica che l'output di Floyd-Steinberg contiene componenti con valori di 0 e 255, ma questo non ha senso con 7 bit; dovrebbe essere 0 e 254, o 1 e 255. A meno che non stiate usando i colori pari da 0-126 e quelli dispari da 129-255? –

+0

Il problema è che non conosco mappature di bit troppo esatte, ecco perché ho creato tale domanda - per cercare l'algoritmo di dithering del programma X. –

+0

Se potessi pubblicare l'immagine del risultato potremmo essere in grado di capire la mappatura dei bit. –

risposta

2

Se si stanno riducendo da 8 bit a 7, si sta gettando via quasi nessuna informazione. Sei sicuro di aver bisogno anche del dither?

Se è necessario eseguire il dithering, aggiungere rumore casuale e quindi ritagliare, sarà molto utile per l'applicazione.

+0

Questo è il più vicino a quello che ho fatto e non ci sono risposte migliori, quindi contrassegnerò questo come risposta accettata. –

3

È possibile utilizzare uno ordered dither. È più rozzo di Floyd-Steinberg ma non c'è dipendenza tra i pixel.

Modifica: Poiché si rimuove solo un singolo bit, questo diventa quasi banale. Il principio alla base del dither ordinato è quello di creare uno schema che condiziona la soglia di transizione; in questo caso il bias sarà 0 o 1 e il pattern sarà 2x2 pixel. Queste due modifiche insieme renderanno il modello molto meno odioso di quello nell'articolo di Wikipedia - potrebbe piacerti anche meglio di Floyd-Steinberg.

Ecco alcuni pseudo-codice:

bias = (X xor Y) and 0x01 
value = pixel + bias 
if value > 255: value = 255 
pixel = value and 0x7e 

Edit 2: Ecco il mio risultato differenza, come meglio che posso fare. Senza sapere come si mappano i valori a 7 bit a 8 bit non riesco a fare meglio.

alt text

+0

Il dithering ordinato non si adatta, perché il suo output visivo è molto diverso dal dithering di Floyd-Steinberg. (Per vedere grandi differenze, provare ad applicare il dithering ordinato e Steinberg all'immagine con grandi aree in colori monocromatici e confrontare i risultati) –

+0

@ 0x69, ho ammesso nella risposta che l'output è grossolano. Puoi dirci quale profondità di bit stai generando e quale tavolozza stai usando, se presente? –

+0

Vedere la mia modifica ... –