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")]] |