Computergrafik

Ordered Dither

GL Stippling | | GL Screen Door

Ordered Dithering: Darstellung von Grauwerten als Bitmuster mit Schwellwertmaske

  • Vorteil: Mehr Grauwerte perzeptiv darstellbar als Grauwerte zur Verfügung stehen
  • Nachteil: Muster erkennbar, unscharfe ausgefranste Kanten

Die Dither-Punktmaske enthält alle möglichen Grauwerte in einer pseudo-zufälligen Ordnung. Wird die Dither-Punktmaske als sich wiederholendes Muster über den Bildschirm gelegt, so wird ein Punkt schwarz gezeichnet, wenn der zu zeichnende Grauwert den des entsprechenden Punktes der Dithermaske übersteigt.

Sei g Grauwert im Bereich 0–3 und die Dither-Punktmaske:

  0   2
  3   1

Damit lassen sich 5 Graustufen als Bitmuster erzeugen:

value   | 0   1   2   3   4
----------------------------
pattern | ..  x.  x.  xx  xx
        | ..  ..  .x  .x  xx
Lena Lena-OD

Sei g Grauwert von 0–15 und die Dither-Punktmaske:

  0   8   2  10
 12   4  14   6
  3  11   1   9
 15   7  13   5

Damit lassen sich 17 Graustufen als Bitmuster erzeugen.

Sei g Grauwert von 0–63 und die Dither-Punktmaske:

  0  32   8  40   2  34  10  42
 48  16  56  24  50  18  58  26
 12  44   4  36  14  46   6  38
 60  28  52  20  62  30  54  22
  3  35  11  43   1  33   9  41
 51  19  59  27  49  17  57  25
 15  47   7  39  13  45   5  37
 63  31  55  23  61  29  53  21

Damit lassen sich 65 Graustufen als Bitmuster erzeugen.

Generierung einer beliebigen Punktmaske:

#include <stdio.h>

static const int n=16;

int mask[n][n];
int m;

void gen(int x,int y,int s)
   {
   if (s<n)
      {
      gen(x,y,s*2);
      gen(x+s,y+s,s*2);
      gen(x+s,y,s*2);
      gen(x,y+s,s*2);
      }
   else
      mask[x][y]=m++;
   }

int main()
   {
   m=0;
   gen(0,0,1);

   for (int y=0; y<n; y++)
      {
      for (int x=0; x<n; x++) printf("%3d ",mask[x][y]);
      printf("\n");
      }

   return(0);
   }


GL Stippling | | GL Screen Door

Options: