{"id":1762,"date":"2025-10-10T08:52:35","date_gmt":"2025-10-10T06:52:35","guid":{"rendered":"https:\/\/www.vintrospektiv.de\/?p=1762"},"modified":"2025-10-10T08:52:36","modified_gmt":"2025-10-10T06:52:36","slug":"grafisches-dithering","status":"publish","type":"post","link":"https:\/\/www.vintrospektiv.de\/index.php\/2025\/10\/grafisches-dithering\/","title":{"rendered":"Grafisches Dithering"},"content":{"rendered":"\n<p>Der vorletzte der <a href=\"https:\/\/www.vintrospektiv.de\/index.php\/2025\/09\/university-results\/\">angek\u00fcndigten<\/a> Artikel aus meinem Studium befasst sich mit Dithering, hier speziell zur Anwendung als Web-\/OpenGL-Shader. Ich habe allerdings aus Zeitgr\u00fcnden keine Implementierung abgeliefert, sondern lediglich einen Ansatz, wie die Implementierung umgesetzt werden k\u00f6nnte.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Beschreibung des grafischen Ditherings mit Implementierungsansatz<\/h2>\n\n\n\n<p class=\"has-medium-font-size\">Miron Schmidt 2023<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Grundlagen<\/h3>\n\n\n\n<p>Dithering ist die Anwendung von Rauschen zur Verteilung von Quantisierungsfehlern.<sup data-fn=\"7380056c-c6ec-4715-9872-5fc45f614b68\" class=\"fn\"><a href=\"#7380056c-c6ec-4715-9872-5fc45f614b68\" id=\"7380056c-c6ec-4715-9872-5fc45f614b68-link\">1<\/a><\/sup> In der Computergrafik dient Dithering oft der Darstellung von Bildern in begrenzten Farbpaletten, etwa, um Bitplanes und damit Speicher oder Rechenzeit einzusparen (auch Farbreduktion genannt).<\/p>\n\n\n\n<p>Der Begriff \u201eRauschen\u201c ist hier missverst\u00e4ndlich, da nicht unbedingt eine zuf\u00e4llige Verteilung gemeint ist (siehe allerdings Abschnitt 2), sondern oft regelm\u00e4\u00dfige Rastermuster. F\u00fcr die Anordnung gibt es zahlreiche Algorithmen, z. B. Ordered Dithering<sup data-fn=\"af0875f2-2151-4f83-b6f1-95fd3ee8f5a7\" class=\"fn\"><a href=\"#af0875f2-2151-4f83-b6f1-95fd3ee8f5a7\" id=\"af0875f2-2151-4f83-b6f1-95fd3ee8f5a7-link\">2<\/a><\/sup> , Floyd-Steinberg<sup data-fn=\"afd42de4-0e16-403f-9287-74fdc7bb3cbb\" class=\"fn\"><a href=\"#afd42de4-0e16-403f-9287-74fdc7bb3cbb\" id=\"afd42de4-0e16-403f-9287-74fdc7bb3cbb-link\">3<\/a><\/sup> oder Burkes<sup data-fn=\"4e6c314b-69d9-4b3a-acd4-cbd872c38e3c\" class=\"fn\"><a href=\"#4e6c314b-69d9-4b3a-acd4-cbd872c38e3c\" id=\"4e6c314b-69d9-4b3a-acd4-cbd872c38e3c-link\">4<\/a><\/sup> .<\/p>\n\n\n\n<p>Grunds\u00e4tzlich werden bei der Farbreduktion Schwellenwerte gebildet, nach denen aus einer Farbe die n\u00e4chstm\u00f6gliche im vorhandenen Farbpool errechnet wird. Im einfachsten Fall, der Darstellung mit einem Bit, kann die Farbe im Pool 0 oder 1 sein. Alle Farbwerte mit einem Durchschnittswert \u00fcber 50 % erhalten dann den Wert 1, die anderen den Wert 0. Beim Dithering geschieht dies weiterhin, der Schwellenwert f\u00fcr jedes Pixel wird aber ver\u00e4ndert, um eine weniger harte Abstufung zu erreichen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Beschreibung<\/h3>\n\n\n\n<p>Die einfachste Form des Dithering ist sehr wohl die \u00dcberlagerung von Rauschen auf das Bild (Abb. 1c). Der Schwellenwert wird dadurch um einen Zufallsfaktor ver\u00e4ndert, sodass die Pixel st\u00e4rker gestreut werden.<\/p>\n\n\n\n<p>Bei den meisten Dithering-Algorithmen werden jedoch die Folgepixel mit dem Quantisierungsfehler des aktuellen Pixels verrechnet.<\/p>\n\n\n\n<p>Einer der bekanntesten und \u00e4ltesten Dithering-Algorithmen ist der nach Floyd und Steinberg<sup data-fn=\"934e6e56-731b-4518-b856-cfe7018f8df2\" class=\"fn\"><a href=\"#934e6e56-731b-4518-b856-cfe7018f8df2\" id=\"934e6e56-731b-4518-b856-cfe7018f8df2-link\">5<\/a><\/sup> , den ich hier exemplarisch vorstellen m\u00f6chte.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-2 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"180\" height=\"215\" data-id=\"1764\" src=\"https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/David-1.png\" alt=\"\" class=\"wp-image-1764\"\/><figcaption class=\"wp-element-caption\">(a) Original<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"180\" height=\"215\" data-id=\"1765\" src=\"https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/David-2.png\" alt=\"\" class=\"wp-image-1765\"\/><figcaption class=\"wp-element-caption\">(b) Schwellenwert 50 %<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"180\" height=\"215\" data-id=\"1763\" src=\"https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/David-3.png\" alt=\"\" class=\"wp-image-1763\"\/><figcaption class=\"wp-element-caption\">(c) Zufalls-Dithering<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"180\" height=\"215\" data-id=\"1766\" src=\"https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/David-4.png\" alt=\"\" class=\"wp-image-1766\"\/><figcaption class=\"wp-element-caption\">(d) Floyd-Steinberg<\/figcaption><\/figure>\n<figcaption class=\"blocks-gallery-caption wp-element-caption\">Abbildung 1: Michelangelos David gedithert (Quelle: Wikipedia, Public Domain)<\/figcaption><\/figure>\n\n\n\n<p>Hierbei wird der Quantisierungsfehler durch 16 geteilt und auf die Schwellenwerte f\u00fcr umliegende Pixel verteilt: 7 Anteile auf das horizontal folgende Pixel, 3 auf das links unter dem Pixel liegende Pixel, 5 auf das direkt darunter liegende und 1 auf das rechts unter ihm liegende. Die bereits verarbeiteten Pixel werden also nicht mehr ver\u00e4ndert, Pixel in der n\u00e4chsten Zeile daf\u00fcr m\u00f6glicherweise sp\u00e4ter noch einmal. Durch diese Verteilung wird die Wahrscheinlichkeit ver\u00e4ndert, dass Pixel den Schwellenwert erreichen, und es entsteht das in Abbildung 1d dargestellte Muster.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Implementierungsansatz<\/h3>\n\n\n\n<p>Der folgende Pseudocode<sup data-fn=\"a4277bec-42e1-4f78-86c3-371ed4de5854\" class=\"fn\"><a href=\"#a4277bec-42e1-4f78-86c3-371ed4de5854\" id=\"a4277bec-42e1-4f78-86c3-371ed4de5854-link\">6<\/a><\/sup> gibt den Floyd-Steinberg-Algorithmus wieder:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>for each y from top to bottom do\n    for each x from left to right do\n\toldpixel := pixels&#91;x]&#91;y]\n\tnewpixel := find_closest_palette_color(oldpixel)\n\tpixels&#91;x]&#91;y] := newpixel\n\tquant_error := oldpixel - newpixel\n\tpixels&#91;x + 1]&#91;y    ] := pixels&#91;x + 1]&#91;y    ]\n\t    + quant_error * 7 \/ 16\n\tpixels&#91;x - 1]&#91;y + 1] := pixels&#91;x - 1]&#91;y + 1]\n\t    + quant_error * 3 \/ 16\n\tpixels&#91;x    ]&#91;y + 1] := pixels&#91;x    ]&#91;y + 1]\n\t    + quant_error * 5 \/ 16\n\tpixels&#91;x + 1]&#91;y + 1] := pixels&#91;x + 1]&#91;y + 1]\n\t    + quant_error * 1 \/ 16<\/code><\/pre>\n\n\n\n<p>Um Floyd-Steinberg-Dithering in einem Shader etwa in WebGL zu implementieren, w\u00fcrde dieser Code im Multipassverfahren angewendet werden: Zuerst wird das Bild der Szene in ein daf\u00fcr angelegtes Framebuffer-Objekt gerendert, dann wird auf dieses Framebuffer-Objekt in einem zweiten Pass der Dithering-Algorithmus angewendet (z. B. nach Reduktion der Bitplanes) und wiederum in den Standard-Framebuffer gerendert, normalerweise also auf dem Bildschirm ausgegeben.<\/p>\n\n\n<ol class=\"wp-block-footnotes\"><li id=\"7380056c-c6ec-4715-9872-5fc45f614b68\">vgl. die Masterarbeit von Larence G. Roberts, in abgewandelter Artikelform unter <a href=\"http:\/\/www.packet.cc\/files\/pic-code-noise.html\">http:\/\/www.packet.cc\/files\/pic-code-noise.html<\/a> (archiviert im Internet Archive, Stand: 6.2.2024) <a href=\"#7380056c-c6ec-4715-9872-5fc45f614b68-link\" aria-label=\"Jump to footnote reference 1\">\u21a9\ufe0e<\/a><\/li><li id=\"af0875f2-2151-4f83-b6f1-95fd3ee8f5a7\">s. etwa <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ordered_dithering\">https:\/\/en.wikipedia.org\/wiki\/Ordered_dithering<\/a> (Stand: 6.2.2024) <a href=\"#af0875f2-2151-4f83-b6f1-95fd3ee8f5a7-link\" aria-label=\"Jump to footnote reference 2\">\u21a9\ufe0e<\/a><\/li><li id=\"afd42de4-0e16-403f-9287-74fdc7bb3cbb\">s. etwa <a href=\"https:\/\/en.wikipedia.org\/wiki\/Floyd-Steinberg_dithering\">https:\/\/en.wikipedia.org\/wiki\/Floyd-Steinberg_dithering<\/a> (Stand: 6.2.2024) <a href=\"#afd42de4-0e16-403f-9287-74fdc7bb3cbb-link\" aria-label=\"Jump to footnote reference 3\">\u21a9\ufe0e<\/a><\/li><li id=\"4e6c314b-69d9-4b3a-acd4-cbd872c38e3c\">eine Weiterentwicklung der Matrix von Jarvis, Judice und Ninke, beschrieben z. B. unter <a href=\"https:\/\/tannerhelland.com\/2012\/12\/28\/dithering-eleven-algorithms-source-code.html\">https:\/\/tannerhelland.com\/2012\/12\/28\/dithering-eleven-algorithms-source-code.html<\/a> <a href=\"#4e6c314b-69d9-4b3a-acd4-cbd872c38e3c-link\" aria-label=\"Jump to footnote reference 4\">\u21a9\ufe0e<\/a><\/li><li id=\"934e6e56-731b-4518-b856-cfe7018f8df2\">vgl. den <a href=\"https:\/\/en.wikipedia.org\/wiki\/Floyd\u2013Steinberg_dithering\">Wikipedia-Artikel zum Floyd-Steinberg-Algorithmus<\/a> (Stand: 10.2.2024) <a href=\"#934e6e56-731b-4518-b856-cfe7018f8df2-link\" aria-label=\"Jump to footnote reference 5\">\u21a9\ufe0e<\/a><\/li><li id=\"a4277bec-42e1-4f78-86c3-371ed4de5854\">s. ebd. <a href=\"#a4277bec-42e1-4f78-86c3-371ed4de5854-link\" aria-label=\"Jump to footnote reference 6\">\u21a9\ufe0e<\/a><\/li><\/ol>","protected":false},"excerpt":{"rendered":"<p>Der vorletzte der angek\u00fcndigten Artikel aus meinem Studium befasst sich mit Dithering, hier speziell zur Anwendung als Web-\/OpenGL-Shader. Ich habe allerdings aus Zeitgr\u00fcnden keine Implementierung abgeliefert, sondern lediglich einen Ansatz, wie die Implementierung umgesetzt werden k\u00f6nnte. Beschreibung des grafischen Ditherings mit Implementierungsansatz Miron Schmidt 2023 1. Grundlagen Dithering ist die Anwendung von Rauschen zur Verteilung [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1768,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pgc_sgb_lightbox_settings":"","footnotes":"[{\"content\":\"vgl. die Masterarbeit von Larence G. Roberts, in abgewandelter Artikelform unter <a href=\\\"http:\/\/www.packet.cc\/files\/pic-code-noise.html\\\">http:\/\/www.packet.cc\/files\/pic-code-noise.html<\/a> (archiviert im Internet Archive, Stand: 6.2.2024)\",\"id\":\"7380056c-c6ec-4715-9872-5fc45f614b68\"},{\"content\":\"s. etwa <a href=\\\"https:\/\/en.wikipedia.org\/wiki\/Ordered_dithering\\\">https:\/\/en.wikipedia.org\/wiki\/Ordered_dithering<\/a> (Stand: 6.2.2024)\",\"id\":\"af0875f2-2151-4f83-b6f1-95fd3ee8f5a7\"},{\"content\":\"s. etwa <a href=\\\"https:\/\/en.wikipedia.org\/wiki\/Floyd-Steinberg_dithering\\\">https:\/\/en.wikipedia.org\/wiki\/Floyd-Steinberg_dithering<\/a> (Stand: 6.2.2024)\",\"id\":\"afd42de4-0e16-403f-9287-74fdc7bb3cbb\"},{\"content\":\"eine Weiterentwicklung der Matrix von Jarvis, Judice und Ninke, beschrieben z. B. unter <a href=\\\"https:\/\/tannerhelland.com\/2012\/12\/28\/dithering-eleven-algorithms-source-code.html\\\">https:\/\/tannerhelland.com\/2012\/12\/28\/dithering-eleven-algorithms-source-code.html<\/a>\",\"id\":\"4e6c314b-69d9-4b3a-acd4-cbd872c38e3c\"},{\"content\":\"vgl. den <a href=\\\"https:\/\/en.wikipedia.org\/wiki\/Floyd\u2013Steinberg_dithering\\\">Wikipedia-Artikel zum Floyd-Steinberg-Algorithmus<\/a> (Stand: 10.2.2024)\",\"id\":\"934e6e56-731b-4518-b856-cfe7018f8df2\"},{\"content\":\"s. ebd.\",\"id\":\"a4277bec-42e1-4f78-86c3-371ed4de5854\"}]"},"categories":[16],"tags":[],"class_list":["post-1762","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-introspektiv"],"_links":{"self":[{"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/posts\/1762","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/comments?post=1762"}],"version-history":[{"count":2,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/posts\/1762\/revisions"}],"predecessor-version":[{"id":1769,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/posts\/1762\/revisions\/1769"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/media\/1768"}],"wp:attachment":[{"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/media?parent=1762"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/categories?post=1762"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/tags?post=1762"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}