Floyd–Steinberg dithering is an image
dithering
Dither is an intentionally applied form of noise used to randomize quantization error, preventing large-scale patterns such as color banding in images. Dither is routinely used in processing of both digital audio and video data, and is often ...
algorithm first published in 1976 by
Robert W. Floyd
Robert W Floyd (June 8, 1936 – September 25, 2001) was a computer scientist. His contributions include the design of the Floyd–Warshall algorithm (independently of Stephen Warshall), which efficiently finds all shortest paths in a graph and ...
and
Louis Steinberg. It is commonly used by image manipulation software, for example when an image is converted into
GIF
The Graphics Interchange Format (GIF; or , see pronunciation) is a bitmap image format that was developed by a team at the online services provider CompuServe led by American computer scientist Steve Wilhite and released on 15 June 1987. ...
format that is restricted to a maximum of 256 colors.
Implementation
The algorithm achieves dithering using
error diffusion Error diffusion is a type of halftoning in which the quantization residual is distributed to neighboring pixels that have not yet been processed. Its main use is to convert a multi-level image into a binary image, though it has other applications. ...
, meaning it pushes (adds) the residual
quantization error
Quantization, in mathematics and digital signal processing, is the process of mapping input values from a large set (often a continuous set) to output values in a (countable) smaller set, often with a finite number of elements. Rounding and ...
of a
pixel
In digital imaging, a pixel (abbreviated px), pel, or picture element is the smallest addressable element in a raster image, or the smallest point in an all points addressable display device.
In most digital display devices, pixels are the smal ...
onto its neighboring pixels, to be dealt with later. It spreads the debt out according to the distribution (shown as a map of the neighboring pixels):
:
The pixel indicated with a star (*) indicates the pixel currently being scanned, and the blank pixels are the previously-scanned pixels.
The algorithm scans the image from left to right, top to bottom, quantizing pixel values one by one. Each time the quantization error is transferred to the neighboring pixels, while not affecting the pixels that already have been quantized. Hence, if a number of pixels have been rounded downwards, it becomes more likely that the next pixel is rounded upwards, such that on average, the quantization error is close to zero.
The diffusion coefficients have the property that if the original pixel values are exactly halfway in between the nearest available colors, the dithered result is a checkerboard pattern. For example, 50% grey data could be dithered as a black-and-white checkerboard pattern. For optimal dithering, the counting of quantization errors should be in sufficient accuracy to prevent rounding errors from affecting the result.
In some implementations, the horizontal direction of scan alternates between lines; this is called "serpentine scanning" or
boustrophedon transform
In mathematics, the boustrophedon transform is a procedure which maps one sequence to another. The transformed sequence is computed by an "addition" operation, implemented as if filling a triangular array in a boustrophedon (zigzag- or serpentine-l ...
dithering.
In the following
pseudocode
In computer science, pseudocode is a plain language description of the steps in an algorithm or another system. Pseudocode often uses structural conventions of a normal programming language, but is intended for human reading rather than machine re ...
we can see the algorithm described above. This works for any approximately linear encoding of pixel values, such as 8-bit integers, 16-bit integers or real numbers in the range
,1
for each ''y'' from top to bottom do
for each ''x'' from left to right do
oldpixel := pixels
'x''''y'']
newpixel := find_closest_palette_color(oldpixel)
pixels
'x''''y''] := newpixel
quant_error := oldpixel - newpixel
pixels
'x'' + 1''y'' ] := pixels
'x'' + 1''y'' ] + quant_error × 7 / 16
pixels
'x'' - 1''y'' + 1] := pixels
'x'' - 1''y'' + 1] + quant_error × 3 / 16
pixels
'x'' ''y'' + 1] := pixels
'x'' ''y'' + 1] + quant_error × 5 / 16
pixels
'x'' + 1''y'' + 1] := pixels
'x'' + 1''y'' + 1] + quant_error × 1 / 16
When converting greyscale pixel values from a high to a low bit depth (e.g. 8-bit greyscale to 1-bit black-and-white),
find_closest_palette_color()
may perform just a simple rounding, for example:
find_closest_palette_color(oldpixel) = round(oldpixel / 255)
The pseudocode can result in pixel values exceeding the valid values (such as greater than 255 in 8-bit greyscale images). Such values should ideally be clipped by the
find_closest_palette_color()
function, rather than clipping the intermediate values, since a subsequent error may bring the value back into range. However, if fixed-width integers are used, wrapping of intermediate values would cause inversion of black and white, and so should be avoided.
The is nontrivial for a palette that is not evenly distributed. In such a case, a
nearest neighbor search
Nearest neighbor search (NNS), as a form of proximity search, is the optimization problem of finding the point in a given set that is closest (or most similar) to a given point. Closeness is typically expressed in terms of a dissimilarity function ...
in 3D is required.
References
Floyd–Steinberg Dithering(Graphics course project, Visgraf lab, Brazil)
*R.W. Floyd, L. Steinberg, ''An adaptive algorithm for spatial grey scale''. Proceedings of the Society of Information Display 17, 75–77 (1976).
See also
*
Atkinson dithering, a variant of Floyd-Steinberg dithering designed by Bill Atkinson
{{DEFAULTSORT:Floyd-Steinberg dithering
Image processing
Articles with example pseudocode
Computer graphics algorithms
Articles with example code