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 になります。
画像の基本構造
このピクセルを縦横に敷き詰めたものが、画像の基本構造になります。
例えば
縦 1080
の画像は
の集合体になります。
メモリ上での画像表現
コンピュータのメモリは byte(8bit)単位 で扱われます。
そのため画像データも byte配列として扱うと都合が良い という特徴があります。
例えば
のような配列にピクセルデータを格納します。
一見すると画像は2次元構造なので
のような 2次元配列 を使いたくなりますが、実際の画像処理ライブラリでは
一次元のフラットな配列
として格納する場合がほとんどです。
これは
-
メモリ構造に一致する
-
キャッシュ効率が良い
-
高速処理に向く
といった理由があります。
ストライド(Stride)
画像データは単純に
で並んでいるとは限りません。
多くの画像フォーマットでは、メモリアライメントの都合で1行のサイズが調整されます。
この「1行の実際のバイト数」を Stride(ストライド) と呼びます。
つまり
となる場合があります。
そのため画像処理では
のように計算してピクセルにアクセスする必要があります。

コメント