| 19 |   |  * [wiki:libcaca/study/1 1. Colour quantisation] | 
                      
                        | 20 |   |    * 1.1. Black and white thresholding | 
                      
                        | 21 |   |    * 1.2. Greyscale thresholding | 
                      
                        | 22 |   |    * 1.3. Dynamic thresholding | 
                      
                        | 23 |   |    * 1.4. Random dithering | 
                      
                        | 24 |   |  * [wiki:libcaca/study/2 2. Halftoning] | 
                      
                        | 25 |   |    * 2.1. Halftoning patterns | 
                      
                        | 26 |   |    * 2.2. Screen artifacts | 
                      
                        | 27 |   |    * 2.3. Ordered dithering | 
                      
                        | 28 |   |    * 2.4. Random ordered dithering | 
                      
                        | 29 |   |    * 2.5. Non-rectangular dither tiles | 
                      
                        | 30 |   |    * 2.6. Supercell dithering | 
                      
                        | 31 |   |    * 2.7. Void and cluster method | 
                      
                        | 32 |   |  * [wiki:libcaca/study/3 3. Error diffusion] | 
                      
                        | 33 |   |    * 3.1. Floyd-Steinberg and !JaJuNi error diffusion | 
                      
                        | 34 |   |    * 3.2. Floyd-Steinberg derivatives | 
                      
                        | 35 |   |    * 3.3. Changing image parsing direction | 
                      
                        | 36 |   |    * 3.4. Variable coefficients error diffusion | 
                      
                        | 37 |   |    * 3.5. Block error diffusion | 
                      
                        | 38 |   |    * 3.6. Sub-block error diffusion | 
                      
                        | 39 |   |    * 3.7. Direct binary search | 
                      
                        | 40 |   |  * [wiki:libcaca/study/4 4. Model-based dithering] | 
                      
                        | 41 |   |    * 4.1. Gaussian human visual system model | 
                      
                        | 42 |   |    * 4.2. Direct binary search | 
                      
                        | 43 |   |    * 4.3 Comparing dithering algorithms | 
                      
                        | 44 |   |  * [wiki:libcaca/study/5 5. Greyscale dithering] | 
                      
                        | 45 |   |    * 5.1. Introducing gamma | 
                      
                        | 46 |   |    * 5.2. Gamma correction | 
                      
                        | 47 |   |    * 5.3. Greyscale sub-block error diffusion | 
                      
                        | 48 |   |  * [wiki:libcaca/study/6 6. Colour dithering] | 
                      
                        | 49 |   |    * 6.1. Separate-space dithering | 
                      
                        | 50 |   |    * 6.2. Accounting for other dimensions | 
                      
                        | 51 |   |    * 6.3. Reducing visual artifacts | 
                      
                        | 52 |   |    * 6.4. Colour sub-block error diffusion | 
                      
                        | 53 |   |  * [wiki:libcaca/study/7 7. Photographic mosaics] | 
                      
                        | 54 |   |    * 7.1. Image classification | 
                      
                        | 55 |   |    * 7.2. Error diffusion | 
                      
                        | 56 |   |    * 7.3. Colour ASCII art | 
                      
                        | 57 |   |  * [wiki:libcaca/study/bibliography Bibliography] | 
                      
                      
                        |   | 19 | [[Image(source:/web/trunk/static/study/out/lena1-1-2.png,alt="40% threshold")]] | 
                      
                        |   | 20 | [[Image(source:/web/trunk/static/study/out/grad1-1-2.png,alt="40% threshold gradient")]] | 
                      
                        |   | 21 | [[Image(source:/web/trunk/static/study/out/lena1-1-3.png,alt="60% threshold")]] | 
                      
                        |   | 22 | [[Image(source:/web/trunk/static/study/out/grad1-1-3.png,alt="60% threshold gradient")]] | 
                      
                        |   | 23 |  | 
                      
                        |   | 24 | Choosing the best thresholding value for a given image is called average dithering. But even with the best value, the results will not improve tremendously. | 
                      
                        |   | 25 |  | 
                      
                        |   | 26 | == 1.2. Greyscale thresholding == | 
                      
                        |   | 27 |  | 
                      
                        |   | 28 | Better results can be achieved with a slightly bigger palette. Here is thresholding applied to a 3-colour and to a 5-colour palette: | 
                      
                        |   | 29 |  | 
                      
                        |   | 30 | [[Image(source:/web/trunk/static/study/out/lena1-2-1.png,alt="3-colour threshold")]] | 
                      
                        |   | 31 | [[Image(source:/web/trunk/static/study/out/grad1-2-1.png,alt="3-colour threshold gradient")]] | 
                      
                        |   | 32 | [[Image(source:/web/trunk/static/study/out/lena1-2-2.png,alt="5-colour threshold")]] | 
                      
                        |   | 33 | [[Image(source:/web/trunk/static/study/out/grad1-2-2.png,alt="5-colour threshold gradient")]] | 
                      
                        |   | 34 |  | 
                      
                        |   | 35 | Using this method, shades of grey are evenly used. However, the global error is far from optimal, as the following graphs show: | 
                      
                        |   | 36 |  | 
                      
                        |   | 37 | [[Image(source:/web/trunk/static/study/fig1-2-1.png,alt="mean error 0.138")]] | 
                      
                        |   | 38 | [[Image(source:/web/trunk/static/study/fig1-2-2.png,alt="mean error 0.075")]] | 
                      
                        |   | 39 |  | 
                      
                        |   | 40 | The following thresholding method minimises the error, at the cost of underusage of pure black and white colours: | 
                      
                        |   | 41 |  | 
                      
                        |   | 42 | [[Image(source:/web/trunk/static/study/out/lena1-2-3.png,alt="3-colour threshold, minimal error")]] | 
                      
                        |   | 43 | [[Image(source:/web/trunk/static/study/out/grad1-2-3.png,alt="3-colour threshold gradient, minimal error")]] | 
                      
                        |   | 44 | [[Image(source:/web/trunk/static/study/out/lena1-2-4.png,alt="5-colour threshold, minimal error")]] | 
                      
                        |   | 45 | [[Image(source:/web/trunk/static/study/out/grad1-2-4.png,alt="5-colour threshold gradient, minimal error")]] | 
                      
                        |   | 46 |  | 
                      
                        |   | 47 | [[Image(source:/web/trunk/static/study/fig1-2-3.png,alt="mean error 0.125")]] | 
                      
                        |   | 48 | [[Image(source:/web/trunk/static/study/fig1-2-4.png,alt="mean error 0.0625")]] | 
                      
                        |   | 49 |  | 
                      
                        |   | 50 | This is a perfect example of a situation where colour accuracy does not help achieve a better result. | 
                      
                        |   | 51 |  | 
                      
                        |   | 52 | == 1.3. Dynamic thresholding == | 
                      
                        |   | 53 |  | 
                      
                        |   | 54 | Dynamic thresholding consists in studying the image before selecting the threshold values. One strategy, for instance, is to choose the median pixel value. This is done simply by computing a histogram of the image. | 
                      
                        |   | 55 |  | 
                      
                        |   | 56 | [[Image(source:/web/trunk/static/study/out/lena1-3-1.png,alt="2-colour dynamic threshold")]] | 
                      
                        |   | 57 | [[Image(source:/web/trunk/static/study/out/grad1-3-1.png,alt="2-colour dynamic threshold gradient")]] | 
                      
                        |   | 58 | [[Image(source:/web/trunk/static/study/out/lena1-3-2.png,alt="5-colour dynamic threshold")]] | 
                      
                        |   | 59 | [[Image(source:/web/trunk/static/study/out/grad1-3-2.png,alt="5-colour dynamic threshold gradient")]] | 
                      
                        |   | 60 |  | 
                      
                        |   | 61 | == 1.4. Random dithering == | 
                      
                        |   | 62 |  | 
                      
                        |   | 63 | Instead of constantly using the same threshold value, one can use a different random value for each pixel in the image. This technique is simply called random dithering. | 
                      
                        |   | 64 |  | 
                      
                        |   | 65 | Here are two simple examples. On the left, threshold values are uniformly chosen between 0 and 1. On the right, random dithering with threshold values chosen with a gaussian distribution (mean 0.5, standard deviation 0.15): | 
                      
                        |   | 66 |  | 
                      
                        |   | 67 | [[Image(source:/web/trunk/static/study/out/lena1-4-1.png,alt="random dithering")]] | 
                      
                        |   | 68 | [[Image(source:/web/trunk/static/study/out/grad1-4-1.png,alt="random dithering gradient")]] | 
                      
                        |   | 69 | [[Image(source:/web/trunk/static/study/out/lena1-4-2.png,alt="gaussian (0.5, 0.15) random dithering")]] | 
                      
                        |   | 70 | [[Image(source:/web/trunk/static/study/out/grad1-4-2.png,alt="gaussian (0.5, 0.15) random dithering gradient")]] | 
                      
                        |   | 71 |  | 
                      
                        |   | 72 | The images look very noisy, but they are arguably an improvement over standard constant thresholding. | 
                      
                        |   | 73 |  | 
                      
                        |   | 74 | Finally, this is dynamic thresholding with 4 colours where threshold values at every pixel are computed as usual, but then perturbated using a gaussian distribution (mean 0, standard deviation 0.08): | 
                      
                        |   | 75 |  | 
                      
                        |   | 76 | [[Image(source:/web/trunk/static/study/out/lena1-4-1.png,alt="4-colour dynamic thresholding, gaussian (0, 0.08)")]] | 
                      
                        |   | 77 | [[Image(source:/web/trunk/static/study/out/grad1-4-1.png,alt="4-colour dynamic thresholding, gaussian (0, 0.08) gradient")]] |