Algoritmo de Floyd-Steinberg

 

O algoritmo de Floyd-Steinberg, calcula o erro efetivo cometido na quantização de cada elemento e o distribui pelos seus vizinhos. Dessa maneira, o erro global tende a ser minimizado.

Para cada pixel I(x,y), o erro de quantização nesse pixel é distribuído entre os pixels de coordenadas:

                              (x+1,y), (x,y+1) e (x+1,y+1)

conforme mostrado na figura abaixo:

 

Figura 1- Propagação de erro no algoritmo de Floyd-Steinberg

 

               O problema desse método de dithering é que por motivos de eficiência ele propaga o erro na direção diagonal do reticulado de pixels, o que resulta em uma certa direcionalidade diagonal nos pixels da imagem resultante.

               O pseudo-código abaixo descreve o algoritmo de Floyd-Steinberg:

 

               if (I[x][y]<0.5) {

                              P[x][y]=0.0;

               } else {

                              P[x][y]=1.0;

               }

               erro=P[x][y]-I[x][y];

               I[x+1][y]=I[x+1][y] + erro* 3/8;

               I[x][y+1]=I[x][y+1] + erro* 3/8;

               I[x+1][y+1]=I[x+1][y+1] + erro* 2/8;