← [ FRONT / 辺境部 ] に戻る
OBSERVATION · 其の3067 · 2026.04.03

砂嵐に浮かぶもの 第3回: 砂嵐をプログラムで作る

砂嵐に浮かぶもの 第3回: 砂嵐をプログラムで作る — 砂嵐, 640x480, ピクセル

こんにちは、パレイド辺境部の橘です。

前回は砂嵐がどこから来て、どこへ消えたのかを追いました。今回は、消えてしまった砂嵐をプログラムで蘇らせます。

本記事はLLMによる自動執筆パイプラインで生成されました。現在は人間が補助していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。

640×480——砂嵐の「粒度」

PC画面で砂嵐を再現するには、まずサイズと粒度を決めなければなりません。 テレビのアスペクト比である4:3はよく知られていますが、解像度は一体どれくらいでしょうか。

日本のアナログ放送はNTSC方式を採用していました。走査線は525本、うち映像として使われるのは約480本。水平方向の解像度は規格上明確な数値がありませんが、実際の放送ではおおよそ330本程度の水平解像度を持っていました。デジタル環境ではこれをそのまま表現できないため、4:3比で扱いやすい640×480ピクセルが、結果的に近い感覚の単位として用いられています。

ということで、砂嵐の画面サイズは 640×480ピクセル で再現することにします。 いわゆるDOS/V機の解像度ですね。 日本では「国民機」の640×400ピクセルが馴染みがあるかもしれません。

ブラウン管には「画素」がない

ここで一つ、見落としやすい事実があります。ブラウン管テレビには画素(ピクセル)という概念がありません。

液晶テレビは小さな四角い素子が格子状に並んでいて、1つ1つが独立して光ります。しかしブラウン管は電子ビームが画面を左上から右下まで連続的に走査し、蛍光体を光らせる仕組みです。隣り合う点の間に明確な境界はなく、光はなだらかに繋がっています。

つまり、砂嵐もピクセルの集まりではなく、アナログ波形のランダムな揺らぎだったということです。プログラムで単純にピクセルごとに乱数を振るだけでは、本物の砂嵐とは質感が異なります。

まずは素朴に作る——digitalモード

とはいえ、最初の一歩はシンプルにいきましょう。640×480の各ピクセルに明度0〜255の乱数を入れるだけです。

import numpy as np
from tvstatic.seed import Seed

def generate_static_digital(seed: Seed):
    rng = np.random.Generator(np.random.PCG64(seed.value))
    pixels = rng.integers(0, 256, size=(480, 640), dtype=np.uint8)
    return pixels

ここで重要なのが シード値 です。PCG64 という乱数生成器にシードを渡すことで、同じシードからは常に同じ砂嵐が生成されます。後から「あのシードの砂嵐をもう一度見たい」と思ったとき、完全に再現できる。砂嵐に再現性を持たせるというのは少し奇妙な話ですが、検証するには不可欠な仕組みです。

シード値という言葉は、マインクラフトなどで知った方も多いでしょう。いわゆる「ガチャ」を決定づける要因であり、単なるランダムな数値を生み出す起点のはずが、組み合わせによる奇跡的な挙動にロマンを感じる層もいるかもしれません。

生成された画像は、各ピクセルがくっきりと独立した、デジタル的なノイズになります。

アナログ感を取り戻す——analogモード

このデジタルノイズに、ブラウン管のアナログ感を取り戻す処理を加えます。方法はシンプルで、ガウシアンブラーをかけるだけです。

from scipy.ndimage import gaussian_filter

def generate_static_analog(seed: Seed, blur_sigma=1.2):
    rng = np.random.Generator(np.random.PCG64(seed.value))
    pixels = rng.integers(0, 256, size=(480, 640), dtype=np.uint8)

    # ガウシアンブラーでピクセル境界をぼかす
    pixels = gaussian_filter(pixels.astype(np.float32), sigma=blur_sigma)
    pixels = np.clip(pixels, 0, 255).astype(np.uint8)
    return pixels

ガウシアンブラーは、各ピクセルの値を周囲のピクセルと混ぜ合わせる処理です。sigma=1.2 は「どれくらいの範囲で混ぜるか」を指定するパラメータで、値が大きいほどぼやけます。

この処理によって、隣り合うピクセルの間に相関が生まれます。デジタルモードでは各ピクセルが完全に独立していましたが、アナログモードでは近くのピクセルが似た値を持つようになる。結果として、電子ビームが滲んだような、なだらかなノイズが得られます。

二つの砂嵐を並べてみる

同じシードから生成した、digitalモードとanalogモードの砂嵐を並べると、違いは一目瞭然です。

digitalモードは粒が細かく、チラチラとした印象。analogモードはもう少し大きな明暗のムラがあり、ぼんやりとした質感になります。昔テレビで見た砂嵐の記憶に近いのは、おそらくanalogモードの方でしょう。

ここで一つ気になることがあります。ガウシアンブラーによってピクセル間に相関が生まれるということは、局所的なパターン——たとえば目や口に見えるような明暗の配置——が、digitalモードよりも出現しやすくなるのではないか。

この仮説は次回、実際に顔検出をかけて検証します。

☕ 砂嵐のノイズの一部は、ビッグバンの残光——宇宙マイクロ波背景放射(CMB)に由来するとも言われています。テレビの砂嵐を見るということは、138億年前の宇宙の残響を眺めているということでもあったのです。地デジ化とともに、その窓は永遠に閉じられましたが…


次回は、こうして作った砂嵐に「顔」を探します。3つの検出器を使って、機械は砂嵐に何を見るのか。

▶ 関連動画 · YOUTUBE
━━ 観るのを再開 ━━
動画で観る
YouTube
次の回を読む
【日本人面地形 04】秋田 ── 田沢湖と男鹿、なまはげの半島
辺境部を一覧で
部門アーカイブ
[NEXT] FRONT · 其の4634
【日本人面地形 04】秋田 ── 田沢湖と男鹿、なまはげの半島
[NEXT] FRONT · 其の4698
夢十夜・第二夜 ── 「悟れ」と迫られても。AIに「無」を生成させる不可能