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;