Alternativas de Dithering de Floyd -Steinberg para Pixel Shader
-
27-09-2019 - |
Pergunta
eu sei que Dithering de Floyd -Steinberg O algoritmo não pode ser implementado com o Pixel Shader, porque esse algoritmo é estritamente seqüencial. Mas talvez existam algum algoritmo de derrotamento paralelo de paralelo que, por sua saída visual, é semelhante ao algoritmo Floyd-Steinberg?
Portanto, a questão é: o que são algoritmos de endividamento que são adequados para implementar no Pixel Shader (de preferência GLSL) e com qualidade de saída (muito) semelhante ao Dithering Floyd -Steinberg?
POR FALAR NISSO. Os algoritmos de várias passagens são permitidos até que não haja mais de 2 passes e a sobrecarga da CPU entre esses passes é pequena.
Alguma ideia ?
EDITAR:
Eu preciso de Dithering de cor de 24 bits para cor de 21 bits.
(Isto é - eu preciso converter de 8 bits/canal para 7 bits/canal.)
Editar 2Talvez eu não tenha explicado muito bem o problema. Então, tentarei expandir um pouco o problema exato. O problema é isto - considere que temos esta imagem:
E temos a imagem acima, mas processamos com o algoritmo de Dithering:
Agora, este é um procedimento que testará seu dithering é bom para mim ou não:
1. Carregue essas imagens no Photoshop como uma imagem com 2 camadas.
2. Escolha o modo de mistura de camadas para "diferença".
3. Execute a operação "Merge visível" em camadas, para obter apenas uma camada.
4. Execute a operação => imagem/ajustes/equalize
Depois disso, você deve obter essa imagem:
Como você vê - os pixels do meio que estavam na cor vermelha monótona não estavam em nada. Também o Dithering das zonas de imagem esquerda e direita é um pouco diferente. Tente reconstruir o algoritmo de dithering com esse comportamento.
Solução
Se você está reduzindo de 8 bits para 7, está jogando fora quase nenhuma informação. Tem certeza de que precisa fazer?
Se você precisar fazer, adicione ruído aleatório e, em seguida, clipe, será muito bom para o seu aplicativo.
Outras dicas
Você poderia usar um pedidos pedidos. É mais grosseiro do que Floyd-Steinberg, mas não há dependência entre os pixels.
Editar: Como você está removendo apenas um bit, isso se torna quase trivial. O princípio por trás do Dítor ordenado é criar um padrão que influencia o limiar de transição; Nesse caso, o viés será 0 ou 1 e o padrão será de 2x2 pixels. Essas duas mudanças juntas tornarão o padrão muito menos desagradável do que o do artigo da Wikipedia - você pode até gostar mais do que Floyd -Steinberg.
Aqui está algum pseudo-código:
bias = (X xor Y) and 0x01
value = pixel + bias
if value > 255: value = 255
pixel = value and 0x7e
Editar 2: Aqui está o resultado da minha diferença, da melhor maneira possível. Sem saber como você mapeia seus valores de 7 bits de volta a 8 bits, não consigo fazer melhor.