読者です 読者をやめる 読者になる 読者になる

kentsu.log

何かその時の興味でいろいろする人。最近はScala使ってる。アルゴリズムと自然言語処理、深層学習が大好き。

画像処理における標本化と量子化

はじめに

画像処理でグレースケールと白黒について書いたがそれをもっと掘り下げようとすると

量子化についてのまとめが必要で、さらに量子化を説明しようとすると標本化まで説明しないと行けないので

今回はその両方を説明する

標本化

標本化とはざっくり言えば 空間的・時間的に連続した画像を離散的な点(標本点つまりは画素)の集合に変換すること

標本化によって横方向の画素数M、縦方向の画素数がNとなる場合画像の大きさはM×N画素となる
実際の標本化では各標本点の間隔をどのように選ぶかが問題となる
これに関しては対象画像がどの程度の濃淡を変化を含み、どれだけそれを忠実にとりこみたいかによるところが大きい

もっと細かく言うなら標本定理によって議論され、1次元標本定理が基本になる(らしい)

ここで一次元信号を
{ \displaystyle
g(t)
}
とするなら
g(t)に含まれる周波数がW以下である場合に限り
{ \displaystyle
T = 1/(2W)
}
間隔で標本化した標本値
{ \displaystyle
g(iT) (i = ... -1,0,1,2 ...)
}
を用いて式
{ \displaystyle
g(t) = \sum_{i=-∞}^{∞} g(iT)S(t-iT)
ただし
S(t)=sin(2πWt)/2πWt
}
により完全に復元できる


実際に写真などを取り込む場合(補足)

画像とは基本的に2次元平面上に連続的に分布した情報形態をとっているためコンピュータに取り込む際に一次元信号に直す必要があり走査というものが行われる

走査としては二次元平面を上から順番に一定間隔で水平方向にそってたどり濃淡値、つまり濃度値を取り出していくラスタ走査というのが一般的
そうして得られた一次元信号に対して一定間隔ごとにその値を求めていくことで離散的な点列を得ることができる

さらに動画の場合は時間軸でも標本化することが必要になり
時間軸で標本化、画面垂直、水平それぞれで標本化し3つの過程が必要となる

量子化


標本化によって画像は時間的、空間的に離散的に分布した画素に分解されるが
画素に関しては当然連続的な値になっている
画素の値としては、白〜灰〜黒の濃淡値が該当する
これは光の強さ、つまり明るさや輝度値の場合もある
この連続的な濃度値などを離散的な値に変換するのが量子化

今、量子化前の濃淡値を
{ \displaystyle
z
}
とするとき、濃淡値は連続的なため
{\displaystyle
z_i \leq z \leq z_i+1
}
となっているが、それを量子化すると
{\displaystyle
q_i
}
という整数値になる

このように得られた整数値は濃度値、グレーレベル、濃度レベルとよばれ
真の値zと濃度レベルqの差を量子化誤差という

量子化の方法

量子化レベル間隔が一定である場合

等間隔量子化と呼ばれるもっとも簡単な量子化方法で、標本値の濃度範囲を等間隔に分割する
画素の濃度値zが白から黒の範囲で一様に分布しているような画像に対して量子化誤差が最小になる
そのためこれは一様量子化、直線量子化とも言われる

量子化レベル間隔が一定でない場合

小さい濃度値に対してレベル間隔を細かくし
逆に大きい濃度値に対してはレベルを粗くする方法として、対数量子化がある

それ以外に画素の濃度値の確率密度関数を用いて
入力濃度値と量子化レベルとの平均2乗誤差を小さくする方法としてマックスの量子化がある

さらにはある範囲の濃度値が頻繁に生じ、その他がほとんど生じない場合はその範囲を細かく量子化
範囲外は粗い量子化する方法がある
これは量子化レベル数をそのままに量子化誤差を低減することが可能で漸減的な量子化と言われる

素数、量子レベル数と得られるデジタル画像との関係

ここでは画素数量子化レベルを変えるとどうなるか示す

素数を変えた場合

量子化レベルを256レベルで一定として
素数N*Nでどのように変化するか画像処理でよく見かけるlenna.pngで示す

256*256
f:id:RabbitFoot141:20160206171235p:plain

128*128
f:id:RabbitFoot141:20160206171256p:plain

64*64
f:id:RabbitFoot141:20160206171313p:plain

32*32
f:id:RabbitFoot141:20160206171341p:plain

256*256で十分な画質が得られるが、128,64,32と減っていくごとに一つの画素がブロック上になっているのが目立つ

量子化レベル数を変えた場合

素数を512^2で一定とし(元画像のサイズの関係で256にするの忘れてた)
量子化レベルを64,16,4,2と変化させると以下のようになる

64レベル
f:id:RabbitFoot141:20160206172555p:plain

16レベル
f:id:RabbitFoot141:20160206172622p:plain

4レベル
f:id:RabbitFoot141:20160206172636p:plain

2レベル
f:id:RabbitFoot141:20160206172647p:plain


64レベルではまだ元画像と大差ないがだんだん減らしていくと擬似輪郭(濃淡が本来滑らかに変化している部分で量子化のため濃淡に段差が生じ擬似的に輪郭が存在するように見える現象)が生じ、濃淡の細かい変化が失われ十分な画質を得ることができない

また最後に出した2レベルでは量子化の最も極端な場合で特にグレースケールの場合に2レベルにすることを2値化といい、こういった特殊な画像を2値画像という
後述にもだす予定だが、文字の識別などに使える


量子化レベルとしては一般的な画像では256レベル(8bit)
ただし医用画像など特殊な画像は256レベル以上で4096レベルなどが必要になる

取り扱う画像の画素数

画像を表現するために必要な画素数としては

その画像が空間的にどの程度細かい濃淡変化を含んでいるか
またどの程度細かい濃淡変化まで画像として表現する必要があるか、どの程度の解像度を必要とするかという点と

どの程度の範囲を画像として扱うかということに気をつける必要があり
対象の使用目的、種類に強く依存する

解像度が高くても対象の範囲が狭いならあまり画素数は大きくならないことに注意が必要である