誤差拡散とは?


百聞は一見にしかずということで、音声よりも直感的にわかりやすい画像の場合で、しかも極端な例を用いて説明してみます。

画像1のように比較的滑らかな階調(明るさ0から255までの256階調)を持つ画像があるとします。


画像1: 8ビットグレー画像

この画像を非常に少ない階調(明るさ0か255どちらかの2階調、つまり白か黒かどちらかしか情報がない)の画像に変換する場合を考えます。

・閾値法

一番単純に思いつくのは、元画像のすべての画素について、ちょうど中間の明るさ(明るさ128)よりも明るい画素は白(明るさ255)に変換し、暗い画素は黒(明るさ0)に変換するという方法です。

この方法で変換した結果が画像2です。


画像2: 1ビットモノクロ画像(閾値法による減色)

この画像を見ると、みごとに階調がない絵になってしまい、情報が大きく失われていることが分かりますよね。ノイズが多い図面のような画像を補正する場合はこの方法が効果的なのですが、写真のような画像の忠実な変換には適しません。この方法は、一般に閾値法と呼ばれます。

・組織的ディザ法

次にもう少し工夫をしてみます。
人間の目は、画像中の細かい部分(周波数の高い成分)にはあまり敏感ではありません。この性質を利用し、1画素ずつで画像を考えるのではなく、4画素であたかも1個の画素(これを擬似画素と呼ぶことにします)であるかのように考えてみます。

この場合、1個の擬似画素を構成する画素の黒の個数を変えることにより、擬似画素の見かけ上の階調を増やすことができます。黒の画素の個数を0個から4個まで変えることにより、擬似画素はあたかも5段階の階調を持つかのように見せることができます。

ある1個の画素だけに注目してしまう(高い周波数成分のみに注目してしまう)と元画像とはかなり異なる変換結果となる(高い周波数成分に関しては、ノイズが増える)かもしれませんが、少し範囲を広げて、全体としての画像の印象(低い周波数成分)に注目すると、元画像に近い変換結果となる(低い周波数成分に関してはノイズが減少する)というものです。要するに、人間の目があまり敏感でない高い周波数領域を犠牲にし、その分を人間が敏感なより低い周波数領域ために使用する(ノイズシェイピング)ということです。

この擬似画素を用いて変換した結果が画像3です。


画像3: 1ビットモノクロ画像(組織的ディザ法による減色)

画像2と比べると、かなりましになったように見えませんか?
この絵を1個の画素がはっきり分かるくらい拡大すると、元の絵と全然違うのですが、画素があまり目立たないくらいのサイズ見るとそれらしく見えます。この方法は、一般的に組織的ディザ法と呼ばれる手法の一種です。

実は、この手法は、とても身近なものだったりします。世の中に出回っている印刷物のほとんどががこの手法を使用して滑らかな階調を表現しているんです。手元に雑誌かなにかがありましたらそれを見てください。一見滑らかに見える写真なども、ルーペなどで拡大してみると実はディザで表現されていて、各色が2階調しかない画像であることが分かります。

・誤差拡散法

さらに別の方法を考えてみます。
ディザ法のように固定のパターンを用いるのではなく、明るさに応じて動的に黒画素の比率を変えて変換することを考えてみます。
今度は、また1個ごとの画素で考えます。ある画素を閾値法と同じ方法で白か黒かに変換したとします。すると、例えば明るさ50で本来薄い黒の画素が、真っ黒の明るさ0の画素になるといったように誤差が発生します。閾値法ではこの誤差はすべて無視してすべての画素の変換を行うのですが、今度は前の画素で発生した誤差をその次の画素の変換で考慮することにします。

仕組みは単純で、前の画素で発生した誤差を次の画素に足してやります。先程の例では本来明るさ50のはずが0になってしまいましたので、50の誤差が発生しています。次の画素の本来の明るさが100だとすると、ここに前の誤差を足して次の画素は明るさ150であるとみなします。すると次の画素は明るさ255に変換されることになります。これをすべての画素で繰り返すことにより、閾値法で発生する誤差分の情報を周りの画素に拡散させて埋め込むことができます(画像は2次元であり、実際には次の画素だけでなくxy方向それぞれの周りの画素に誤差を配分しています。この配分の方法が色々と提案されています)。これも基本的な考え方はディザ法と同じで、画像全体としてそれらしく変換しようというものです。

この方法を用いて変換した結果が画像4です。


画像3: 1ビットモノクロ画像(誤差拡散法による減色)

かなりそれらしくなりましたよね。この方法では、おおまかな部分(低い周波数成分)になるほど見かけ上の諧調が向上します。これが一般に誤差拡散法とよばれる手法です。



これまでは画像を用いて説明してきましたが、実はそのまま音声に置き換えることができます。 人間の耳も目と同じく周波数の高い成分(高音)には敏感ではありません。また、高音の成分はもともとあまり多くありません。そのため、画像と同じようにディザや誤差拡散といった手法が有効となります。

情報量が少なく、しかも人間の耳が鈍感な高音部のために多くのビットデータを割り当てるよりも、その分を情報量が多くてしかも人間の耳が敏感な中〜低音部のために使用したほうが効果的な訳です。

waveconv内では50ビット以上に相当する極めて多くの階調を扱うことができるデータ形式で演算を行っています。しかし、最終的には16ビットというあまり諧調がない形式のデータに変換する必要があります。ここに前述の内容をそのまま当てはめることができます。
バージョン0.1より前のバージョンでは、閾値法による変換を行っていましたが、バージョン0.1にて誤差拡散法を用いるようにしています。

トップへ