3 ポイント 投稿者 GN⁺ 2025-10-31 | 2件のコメント | WhatsAppで共有
  • 白黒のピクセル配列で複数段階の明暗を視覚的に再現する原理を説明
  • ディザリング(dithering) は、実際より多くの色や明暗の段階を錯視で表現する技術
  • Ordered dithering 方式では、しきい値マップ(threshold map) を使って各ピクセルの明るさを基準に白黒を決定
  • この過程でピクセル密度の変化がグレースケールの印象を生み出し、元画像の形状を維持
  • この記事はディザリングの基本概念を扱う3部作の第1回で、今後はしきい値マップ生成アルゴリズム誤差拡散(error diffusion) を扱う予定

ディザリングの概念と原理

  • ディザリングは限られた色でより多くの色調を表現するための視覚的技法
    • 白黒ピクセルを特定のパターンで配置し、複数段階のグレースケール錯視を生成
    • 実際の色数を増やさずに視覚的な多様性を確保
  • 記事ではグレースケール画像を例として使用
    • 白黒しか表示できない画面で、各ピクセルを最も近い色(黒または白) に変換
    • 単純変換では明暗の境界が粗くなり、細かな影の情報が失われる
  • ディザリングは一部のピクセルを意図的に反対の色へ置き換えることで、滑らかな明暗の変化を実現
    • 暗い領域では黒いピクセル密度を高め、明るい領域では白いピクセル密度を高める
    • 結果としてピクセル密度の差がグレースケールの錯視を形成

Ordered Ditheringとしきい値マップ

  • Ordered ditheringはしきい値マップ(threshold map) を使うシンプルなディザリング手法
    • しきい値マップは 0(最も暗い) から 1(最も明るい) までの明るさ値グリッドで構成
  • 各入力ピクセルの明るさを、対応する位置のしきい値と比較
    • 明るさがしきい値より大きければ白、小さければ黒に設定
    • この処理をすべてのピクセルに繰り返して白黒パターン画像を生成
  • しきい値マップは入力画像の明るさ分布に応じて、適切な白黒密度パターンを出力するよう設計される
    • 明るい領域は白の比率が高く、暗い領域は黒の比率が高い
    • こうした密度差が離れて見るとグレースケールに見える効果を生み出す

大きな画像の処理と視覚効果

  • 大きな画像をディザリングする際は、しきい値マップを拡張して画像全体のサイズに合わせる
    • 各ピクセルの明るさをしきい値と比較して白黒に変換する同じ原理を適用
  • 結果として画像は2色しか使わないにもかかわらず、元画像の明暗構造を維持
    • 色数は減っても、ピクセル密度の変化によって視覚的な細部表現を維持

ディザリングの意味とシリーズ構成

  • ディザリングは色を追加するのではなく、削減しながら視覚的な多様性を生み出す技術
    • 筆者はこれを「持っているもので最大限を作り出す過程」と表現
  • 今回の記事は3部作の第1回で、基礎原理と視覚的理解に焦点を当てる
    • 次回はしきい値マップ生成アルゴリズムを、最終回は誤差拡散(error diffusion) を扱う予定
  • このシリーズでは、ディザリングにおけるさまざまなアルゴリズム的アプローチと視覚的結果の違いを探っていく予定

筆者とプロジェクト紹介

  • visualrambling.space は Damar が運営する個人プロジェクト
    • さまざまなテーマを視覚的に探究し説明するインタラクティブコンテンツを制作
    • 扱うテーマには Three.js, WebGL, ディザリング, 可視化, インタラクティブ学習 などが含まれる
  • Damar は X/Twitter アカウント(@damarberlari)を通じて、新しいビジュアル記事を継続的に共有する予定

2件のコメント

 
GN⁺ 2025-10-31
Hacker Newsのコメント
  • これは halftone 手法だね。つまり、実際のパレットよりも多くの色があるように見せる方式で、私の見る限り dithering ではない
    dithering は、パレットが十分に大きくないことで生じる banding をなくす技術だと考えている
    ここで示されている halftone は 2 色パレットを 20 色程度に拡張しているが、それでも banding ははっきり残っている
    こうした banding は、もっと多くの色を使うか(例: 256 段階グレースケール、RGB なら 256³)、あるいは dithering で除去できる
    たぶん最後に予告されていた error diffusion 手法が、私の言っている部分だと思う
    dithering の核心は ノイズ にあるが、このデモにはノイズがまったくない。すべてが決定的(deterministic)だ
    それでもプレゼンテーション自体は本当に素晴らしかった

    • error-diffusion ditheringblue-noise/white-noise パターン を使う dithering も、実際には決定的だよ
      一般にノイズは量子化(quantization)の過程で生じ、dithering はそのノイズを 整形 する技術なんだ
      ここで使われている Bayer-matrix ordered dithering は、ノイズを高周波領域に集中させて目立ちにくくするが、低周波領域には依然として banding が残る
      Dave Long が言うように、Bresenham の線描画アルゴリズム も一種の dithering と見なせる。信号が輝度ではなくペンの位置だというだけだ
      関連する議論は数日前にもあった — このスレッド 参照
    • 君の言うことを見て調べてみたけど、こういう手法も依然として ordered dithering と呼ばれているらしい
      Wikipediaの記事
    • banding を減らしたりなくしたりする dithering は本当に印象的だ
      昔の NeXT カラーマシンは 12 ビット(チャネルごとに 4 ビット)ディスプレイだったが、dithering をうまく使うと 24 ビット true color のように見えた
    • 私は ピクセルアーティスト だけど、この手法を使う人たちはみんな dithering と呼んでいる
    • 名前のとおり ordered dithering と呼ぶ
  • Daniel Shiffman の Coding Train 動画を 2 本おすすめする
    Turning Images into Dots: The Magic of Dithering
    Coding Challenge 181: Weighted Voronoi Stippling

  • 興味深いテーマだった。アニメーションも良く、努力の跡が感じられた
    ただ、こういう インタラクティブなプレゼンテーション は従来のブログ記事より読みづらい
    文章の構造がひと目で入ってこないし、文ごとに読まないといけないので、素早くざっと見るのが難しかった

    • これはブログというより 動画に近い形式 として見るのが正しい気がする
      ユーザーが速度を調整できる インタラクティブ動画 という感じだ
      私も普段はテキストを好むけど、こういう形式は悪くない変化だと思う
  • 私はいくつものデザインプロジェクトで orderederror diffusion dithering をビジュアル言語として使ってきた
    特に テック/コンピューター/ブロックチェーン 関連の仕事で、静止画やアニメーションの形で活用していた
    こうした古い技術には独特の 温かみとノスタルジー があって、新しいアイデアと組み合わせるのに向いている
    私の作例は Instagram にある:
    D.Y.O.R. / Printed / Titles / Dithering実験

    • いいリンクだった。私も レトロスタイルのポートフォリオ を作りながら retro shader を実験中だ
      私のサイト olsz.me を参照
  • 以前、2 種類の dithering を切り替えるものを作ったことがある
    GitHubプロジェクト

  • これを本当に気に入りたかったんだけど、動くパターンの上のテキスト を読むのがあまりにもつらかった

    • 私も 7 秒くらいしか持たなかった
  • 可視化の仕方は素晴らしかったが、threshold map の部分が理解できなかった
    マップをどう作り、しきい値をどう決めるのかの説明が足りなかった
    著者にとってはあまりに自明で省略されたのかもしれない

    • ordered threshold map を作るには、かなり巧妙な発想が必要だ
      核心は「threshold」の概念を覚えておくこと。灰色のピクセルはしきい値を基準に白黒へ変わる
      例えば dithered_color = (raw_color > threshold_color) ? white : black
      threshold をランダムに使ってもよい。平均値が 0.5 になれば元のグレーをうまく近似できる
      重要なのは、白いピクセルが徐々に増えるときに互いにくっつかないようにすることだ
      50% グレーなら チェッカーボードパターン、25% なら 2x2 のうち 1 ピクセルだけ白、といった設計ができる
      こういう実験は ShaderToy で直接やってみると面白い
    • 2 部で threshold map、3 部で error diffusion dithering を扱うそうだ
    • 可視化は美しかったけど、私も threshold map の部分は混乱した
      最初は「二値画像」を入力に使うのかと思ったが、後になるとグレー領域を入力にしていた
    • 次回は ドラゴンボールZの次回予告 みたいに感じた
  • dithering は、10 ビットカラーをサポートしないモニターでも十分に 10 ビットらしく見せられる
    banding が消え、ノイズが色深度不足を隠してくれる
    つまり、現代でも有用な技術だ。単なる レトロアート 用ではない

    • そのとおり。でもたいていのソフトウェアはこれをやらない
      みんなはいまだに パレット dithering だけを思い浮かべる
      8 ビット/チャネルでは十分ではない。ガンマ補正のせいで、実際には約 220 段階程度しかない
      私はこうした問題を解決するために、Rust cratedithereens をメンテしている
      README 冒頭のグラデーションを見れば、なぜ重要かすぐわかる
    • 現代の印刷でも dithering は使われている
      高ビット画像を 10 ビットや 8 ビットに落とすとき、ランダム dithering で十分効果がある
      Photoshop は 16 ビット→8 ビット変換時にデフォルトで dithering を適用する
      他のソフトウェアはそうではないので、大きなポスターを印刷するときに banding が出るとすぐ気づくことになる
    • LCD パネル は昔から temporal dithering を使って、より高いビット深度を擬似的に再現している
      6 ビット TN パネルを 8 ビットのように見せていたし、今では HDR-10 にも使われている
      これはピクセルを高速に点滅させて色を混ぜる単純なアルゴリズムだ
      Frame rate control のWikipedia記事
  • プレゼンテーション形式が素晴らしく、次のパートも楽しみだ
    以前 ZX Spectrum Raytracerordered dithering を使ってみたことがあるが、実装が簡単で結果も良かった
    プロジェクトリンク
    80 年代には性能上の問題であまり使われなかったように思う。90 年代の Windows 3.1Monkey Island VGA の背景では見た記憶がある

  • 素晴らしいデモだったが、dithering を「より多くの色調の 幻想(illusion) 」と呼ぶのは正確ではない気がする
    dither された画像を ローパスフィルタ に通すと、実際にその中間色調は存在する
    ちょうど クラスDアンプ がパルス信号を出力しても、フィルタ後には実際のアナログ音になるのと同じだ
    結局、私たちの視覚や距離そのものがそのフィルタの役割を果たしている

    • それでも私はそれを 幻想 と呼ぶ
      注意深く見れば、実際にはその色が存在しないとわかる
      白黒ピクセルだけでグレーを認識するが、同時にそれが錯視だとも認識できる
      だから “illusion” という表現は合っていると思う
 
chinnotching 2025-10-31

テキストは抜きで、映像だけで講堂で講義するというインタラクティブビデオへのアプローチで、壇上を引き裂いてしまうほど圧倒的に格好いいアイテムです。画像のグレースケールを3Dでレイヤー化して見せる場面は、とても親切な説明だと思います。