Nibnib:解凍速度が極めて高速な画像圧縮

2026/10/30 13:17

Nibnib:解凍速度が極めて高速な画像圧縮

RSS: https://news.ycombinator.com/rss

要約▶

Japanese Translation:

nibnib イメージ形式は、RP2350 マイクロコントローラ上で高速かつ決定論的なデコードを目的とした専用圧縮方式である。入力バイト 1 つあたり 2 ピクセルの並列デコードを行い、約 6 クロックサイクルで 1 ピクセル当りのデコードを完了し、4bpp の圧縮比を実現する。絶対値カラーを保持する標準的なパレット形式とは異なり、nibnib はパレットにカラーデルタを格納し、Floyd-Steinberg エラー拡散法を用いて人間の視覚感度特性をモデル化することで滑らかな領域での画質向上を図る。デコード処理は完全に決定論的であり、直前までにデコードされた最終ピクセルを 2 倍とし、ストリームからバイトを読み込みパレットでアップルックして加算し、入力バイト 1 つあたり 2 ピクセルの 16bpp(RGB 565)を生成する。一方、エンコーディングは非対称であり大幅に低速である。可能となるパレットとコードワードの組み合わせに対して探索を行い、立方体を小さなデルタ値および加重付きガウスランダムエントリで構成した初期化から始め、高品質な複製へデコード可能なエンコーディングを選択する。その貪欲的な左から右への探索手法のため、現時点ではシャープなエッジの右側に残留アーティファクトが生じるが、将来のバージョンでは右から左またはブーストロホン方式によるエンコーディングによりこの影響を低減することが可能である。イメージのレイアウトは、2 バイトで幅と高さを格納するヘッダー、256 エントリの 32 ビットパレット、そして各行が 2 ピクセルに続き ((width − 2)/2) バイトのパレットインデックスを持つ構成となっている。追加的なメタデータフィールドは存在せず、この形式はアーカイブストレージではなくリアルタイムレンダラーとの緊密な統合を意図している。元々 RP2350 での DVI 出力実験として開発された nibnib は、Apache License 2.0 または MIT ライセンスのいずれかを選択して vic-2350 リポジトリで入手可能である。

本文

Nibnib:極限デコード速度向け画像フォーマット

Nibnib は、RP2350 微制御装置における DVI 出力画質とパフォーマンスを最大化することを目的として開発された画像フォーマットです。低ビット深度のパレット方式を採用しつつも、パレットよりも優れる画質を実現する技術です。

概要と特徴

  • 開発背景: RP2350 での DVI 出力において、約1 ピクセルあたり 6 サイクルの厳格な予算内での動作を実現するため考案されました。
  • パレット方式の進化: 従来の「ピクセルごとのパレット Lookup」ではなく、デルタ値(差分)を格納することでソフトなグラデーション表現を劇的に改善します。
  • 高速化機構: 入力データを 1 バイトで2 ピクセル分同時にデコードする仕組みにより、4bppの圧縮率を実現しています。

動作原理

デコードプロセスはシンプルかつ決定論的(非ランダム)です。エンコーディング側には多数の選択肢があるため、両者は非対称な関係にあります。

デコードアルゴリズム

  • 処理単位: ピクセルペアごとに処理されます。
  • 手順:
    1. 直前のデコード済みピクセルを複製。
    2. 入力ストリームから 1 バイトを読み出し、パレットで Lookup(色値取得)。
    3. 取得した 32 ビット分の値を、複製された前回のピクセルに足し合わせます。
    4. 低位の 16 ビットが左側のピクセル、上位の 16 ビットが右側のピクセルとなります(RGB565 フォーマット)。

実装例 (Rust)

RP2350 向けのオンザフライデコーダー実装は、

vic-2350
リポジトリに含まれています。以下は内側ループのロジックです。

// まず最初の 2 ピクセルを src[0..4] からコピーし、pix を初期化
for x in 1..(width / 2) {
    let inp = src[x + 3];
    // 左シフトとパレット値の加算により RGB565 値を生成
    pix = ((pix >> 16) * 0x10001).wrapping_add(pal[inp as usize]);
    
    // 低位 16 ビット(左ピクセル)と上位 16 ビット(右ピクセル)を抽出して出力
    out[x * 2] = pix & 0xffff;      // 左側
    out[x * 2 + 1] = pix >> 16;     // 右側
}

エンコーディングについて

エンコーディングは「可能なすべての画像空間を検索し、元の画像に最も近づくものを見つける」というアプローチをとります。これにより、JPEG の数学的逆変換とは異なり、エンコーディング速度がデコーディングの数桁遅いのが現状です。

検索の 2 つの次元

  1. パレットの選択
    • 小規模なデルタ値の立方体と、重み付きガウス分布によるランダム値のブロックから構成されます。
    • 構造はゼロ付近やフルスケール近傍でのオーバーフロー防止のために不可欠です。
  2. コードワード(パレットインデックス)の選定

エラー拡散の工夫

  • 手法: Floyd-Steinberg エラー拡散法を採用しています。
  • 特徴:
    • 通常は 1 ピクセルずつ処理するが、Nibnib は同時に 2 ピクセル生成。
    • パレットエントリ選択時には、両方のピクセルのエラー最小化を図りつつ、和に対して差よりも高い重みを付与しています(人間の視覚系が低い空間周波数に敏感であることのモデル化)。

将来の改善点

現在のバージョンは基本的ながら動作する技術ですが、さらに画質を向上させる余地があります。

  • 検索アルゴリズムの高度化:
    • 現在「貪欲法(グリードイアルゴリズム)」を採用していますが、これによりシャープなエッジの右側にアーティファクトが残ります。
    • デコーディング方向は左から右ですが、エンコーディングを右から左へ(または行ごとに方向を交互に変えるブーストロホドン方式)に変更可能であり、足し算ステップ自体は実用上反転可能です。
  • 探索の深化:
    • 「大まかに同等のエラーを持つ選択」の中から、次のピクセルの探索を有利にするものを優先するなどのより深い探索が可能です。
  • 速度向上:
    • パレットエントリに対するブラストフォース(総当たり)探索を改善したり、パレット構造を工夫したりすることで、エンコーダー自体を高速化しつつ、デコーディング速度への影響を与えずに画質を向上させるアプローチが期待されます。

フォーマット仕様

極めて素朴な設計となっています。

  • ヘッダ: 幅と高さはそれぞれ 2 バイト(計 4 バイト)。
  • パレット: 次いで 256 個の 32 ビットパレットエントリが続きます。
  • ピクセルデータ: 行順に配置されます。
    • 各行は**2 ピクセル(RGB565 フォーマット)**から始まり。
    • その後
      ((width - 2) / 2)
      バイト分のパレットへのインデックスが続きます。
  • Stride: 行 stride は 4 バイトの倍数に丸め上げられています。
  • 用途: メタデータは他になく、アーカイブ用途ではなく、デコーダーと密に連携することを想定しています。

ライセンス

本ソフトウェアは以下のいずれかのライセンスの下で提供されます(ご自由にお選びください)。

同じ日のほかのニュース

一覧に戻る →

2026/11/02 0:58

Show HN: HackerBooks – ハッカートビューのように、HN で言及された本のためのサービス

## Japanese Translation: このテキストは、マウス使用よりも効率を優先したアプリケーション内でのキーボードナビゲーションの習得に必要な手順を提供しています。核心的なメッセージは、特定のキーが本間の移動や異なるコンテンツビューへの瞬時のアクセスを可能にする直接コマンドとして機能することです。例えば、`/` を入力するとフォーカス検索バーが有効化され、`j` または `k` を押すことで家(Home)行から手を離さずにリスト内で縦方向に移動できます。`Enter` を押すとフォーカスされた本が開かれ、`Esc` はウィンドウを閉じたり前の画面に戻ったりします。また、`g` の組み合わせ(例:`g h`, `g t`, `g m`)は、ホーム、全時間最高位、最も推奨されるなどの特定セクションへの直接ジャンプを可能にします。さらに、`?` はヘルプコマンドを表示します。これらのショートカットにより、マウスへの依存が軽減され、カテゴリへの高速アクセスやデジタルライブラリの滑らかな管理が実現されます。結果として、このシステムはユーザーに対しインターフェースに対する即時の制御力を付与し、基本的なナビゲーションタスクを迅速なアクションに変換することで、全体の生産性と使いやすさを向上させます。なお、このガイドは現在の機能への参照ツールとしての役割に限定されています。

2026/10/28 18:46

AFL++ を活用したより効果的なファスティングテストのためのヒント

## Japanese Translation: 6 年間の約 1,000 プロジェクトのテストに基づき、著者は AFL++ が Linux 上の C/C++ fuzzing プラットフォームとして決定版であると主張し、ファジー化されていないソフトウェアにはほぼ間違いなくバグが含まれていることを確認しています。速度を損なうことなく脆弱性の検出を最大化するためには、公式文書で強調されている特定のハイパフォーマンス構成を採用すべきです。主要な最適化策には、クラッシュ間でプログラムの状態を維持するパシストンモードの利用(通常は 10 倍ほど高速化)、`afl-gcc-fast` とともに `-fsanitize=address,undefined` および他のフラグでサニタイザーを設定することが含まれます。具体的なチューニングも不可欠であり、デフォルトの 4KiB リミットを超えて `max_malloc_fill_size` を増やすことで use-after-free エラーを検出し、`detect_stack_use_after_return` を有効化し、GCC の libstdc++ で `-D_GLIBCXX_DEBUG` を用いてコンテナオーバーフローを検出します。さらに、単一の翻訳単位(instrumented target と uninstrumented library)でビルドすることで静的関数の設定を簡略化でき、テスト設計ではグローバル状態の干渉を最小限に抑え、ASan による読み取りミスを防ぐために直接バッファ渡しを避け、ファイル入力は `memfd_create` を使用する必要があります。これらのターゲット指向な調整により、デフォルト設定で見逃されがちな重要なメモリ安全性の問題を発見でき、大規模な fuzzing キャンペーンの徹底的さを大幅に向上させます。

2026/10/30 12:06

新しい 3D テルマール化装衣が物体を赤外線カメラから消し去る

## Japanese 翻訳: 科学者が世界初の 3 次元熱的ステルス cloak を開発・検証しました。この装置は、物体を赤外線カメラから隠すだけでなく、極端な温度からも保護します。以前には特定の熱方向にのみ制限されていた 2 次元バージョンとは異なり、本システムは物体の形状や熱の接近方向に関わらず、熱エネルギーを隠された物体の周りに導きます。その結果、該区域は IR イメージングにおいて熱的に不存在するようになります。これは、3D メタルプリンティングでアルミニウム格子構造を製造し、残りの空間にゴム様の低い熱伝導率を持つ断熱材で充填することで実現されました。この cloak は、独立して 3 方向に構造が調整可能な新しい格子ベースの材料を使用し、より広い範囲の熱伝導率を実現することで、理想的なステルス特性に近い性能を達成します。赤外線カメラによる試験では、隠された領域周囲に熱が導かれながら周囲の温度パターンが維持され、内部温度が一様に保たれたことが確認されました。さらに、人頭形状などの複雑な 3D ジオメトリも成功して隠匿されています。この革新は、これまでの性能限界を克服し、複雑なジオメトリの保護を可能にする点において、熱管理技術における大きな飛躍を示します。潜在的な応用分野には、敏感な微チップの保護、電子機器の冷却、ならびに人員や装備を熱検知から守る防衛システムが含まれます。将来の研究では、これらの cloak が外部源だけでなく、隠された物体自体が生み出す熱を能動的に操作するように進化させることを目指しています。本研究は、イリノイ大学アーバナ・シャンペーン校のスェリー・チャン教授(Shelly Zhang)とデンマーク技術大学のアレクサンダー・シグムンド教授(Ole Sigmund)によって *Nature Communications* に掲載されました。研究支援は、国立科学財団、ビルーム財団、および空軍科学研究局から受けています。

Nibnib:解凍速度が極めて高速な画像圧縮 | そっか~ニュース