文字密度マッピングの仕組み
画像の明るさをASCII文字に変換するアルゴリズムを理解します。輝度計算、文字密度スケール、知覚的明るさマッピングについて学びます。
詳細な説明
画像からASCIIへの変換アルゴリズム
文字密度マッピングは画像をASCIIアートに変換するコア技術です。アイデアはシンプルです:等幅フォントではすべての文字が同じスペースを占めますが、異なる文字はそのスペースの異なる量をインク(または点灯ピクセル)で埋めます。@のような文字はセルのほとんどを埋めますが、ピリオド.はほとんどを空のままにします。
ステップ1:画像をセルに分割
画像は矩形セルのグリッドに分割されます。各セルは出力の1文字に対応します。等幅文字は幅の約2倍の高さがあるため、各セルは出力が引き伸ばされて見えないように1:2の幅対高さ比を持ちます。
ステップ2:平均明るさを計算
各セルについて、アルゴリズムはセル内のすべてのピクセルの平均明るさを計算します。標準的な計算式はITU-R BT.709の輝度係数を使用します:
brightness = 0.2126 * R + 0.7152 * G + 0.0722 * B
これらの重みは人間の目が明るさを知覚する方法を反映しています — 緑が最も貢献し、赤、青の順です。これは3チャンネルの単純平均と比較して知覚的に正確な結果を生成します。
ステップ3:明るさを文字にマッピング
明るさの値(0-255、0-1に正規化)は文字密度スケールのインデックスにマッピングされます。@#%*+=-:. のようなスケールでは、最も暗い文字(@)は明るさ0に、最も明るい文字(スペース)は明るさ1にマッピングされます。
charIndex = floor(brightness * (charSetLength - 1))
character = charSet[charIndex]
反転
暗いターミナル背景では、通常、明るい画像領域を疎な文字(背景色を表示する)に、暗い領域を密な文字にマッピングしたいでしょう。明るい背景では、このマッピングを反転させたい場合があります。
カラー拡張
カラーASCIIアートでは、アルゴリズムは各セルの平均RGB色も保存し、出力文字をインラインカラースタイルのHTML <span>で囲みます。これにより、明るさベースの文字選択とともに元のカラー情報が保持されます。
ユースケース
文字密度マッピングの理解は、ASCIIアートジェネレーターを構築またはカスタマイズする人にとって不可欠です。特定の文字セットがより良い結果を生む理由、異なる背景に合わせて出力を調整する方法、知覚的に正確な明るさ変換の数学を説明します。