C#で汎用的な画像加工処理を行う方法についての基礎知識

コンピュータ

C#で汎用的な画像加工処理を行う方法についての基礎知識

一般的にコンピュータで扱う2次元画像は、ピクセル(点)の集まりとして表現されます。

カラー画像の場合、1つのピクセルは

  • R(Red)

  • G(Green)

  • B(Blue)

の3つの色の強さで構成されます。

一方、グレースケール画像では色の情報は持たず、**明るさ(輝度)**のみを表します。

多くの場合、これらの値は 256段階(8ビット) で表現されます。
カメラのRAWデータや画像処理の途中計算では、より大きなビット数(10bit、12bit、16bitなど)を扱う場合もありますが、人間が最終的に表示して確認する画像では 8ビット(256階調) が一般的です。


ピクセルのデータサイズ

カラー画像の場合

  • R : 8bit

  • G : 8bit

  • B : 8bit

合計 24bit(3byte)

さらに透明度を表す アルファチャンネル(A) を追加すると

  • R

  • G

  • B

  • A

32bit(4byte) になります。

グレースケール画像の場合は

  • 輝度 : 8bit

となるため 1ピクセル = 1byte になります。


画像の基本構造

このピクセルを縦横に敷き詰めたものが、画像の基本構造になります。

例えば

横 1920
縦 1080

の画像は

1920 × 1080 = 2,073,600 ピクセル

の集合体になります。


メモリ上での画像表現

コンピュータのメモリは byte(8bit)単位 で扱われます。
そのため画像データも byte配列として扱うと都合が良い という特徴があります。

例えば

byte[] pixels

のような配列にピクセルデータを格納します。

一見すると画像は2次元構造なので

byte[height][width]

のような 2次元配列 を使いたくなりますが、実際の画像処理ライブラリでは

一次元のフラットな配列

byte[]

として格納する場合がほとんどです。

これは

  • メモリ構造に一致する

  • キャッシュ効率が良い

  • 高速処理に向く

といった理由があります。


ストライド(Stride)

画像データは単純に

ピクセルサイズ × 横幅

で並んでいるとは限りません。

多くの画像フォーマットでは、メモリアライメントの都合で1行のサイズが調整されます。

この「1行の実際のバイト数」を Stride(ストライド) と呼びます。

つまり

Stride >= ピクセルサイズ × 横ピクセル数

となる場合があります。

そのため画像処理では

index = y * stride + x * pixelSize

 

のように計算してピクセルにアクセスする必要があります。

コメント