6.画像の演算と離散化誤差     6.1 整数演算誤差

6.1 整数演算誤差

前ページ

 RGBからYUVへの変換を整数で行う場合の注意点について説明します。普通の画像データは8ビット(1バイト)の正の整数で扱われます。演算も正の整数で実施する方が計算時間が速くなるのと実数と整数との変換をせずに済むのという利点があります。ただし、正の整数と符号付きの整数を時々間違えて思わぬ計算エラーが出ることがあるので、この点に注意が必要です。YUVの値を1000倍の整数で取り扱うときの演算式は以下のようになります。私自身はUVについては下記の演算で得られた値を1000で割り戻して1バイトの正のキャラクターとして取り扱っています。Yに関しては、次節でも平坦化やエッジ強調など各種の演算を実施する必要があり、下記の演算を10で割り戻して2バイトの正の整数として取り扱っています。その根拠を以下で説明します。

Y = 299*R + 587*G + 114*B
U = -169*R - 331*G + 500*B + 128000
V = 500*R - 419*G - 81*B + 128000

 右図にRGB色立方体をYUV変換したY値のヒストグラムを示します。RGB各色の平均は128なので、RGBのヒストグラムをこの図に表示すると0.39の直線上に表示されることになります。YUV変換した後の輝度の分布は、0及び255(図の数値では25500)で低く中央部で高い分布となります。1バイトで取り扱った時の分布と2バイトで取り扱った時の分布はほぼ一致しています。2バイトの場合には輝度の両端付近で対応しない輝度が発生します。1000倍の取り扱いでは輝度が存在する個数は247,024個(欠損数は7,977個)、100倍(=2バイト)では25,316個(欠損数は185個)、10倍では2,550個(欠損数は1個)となります。右図は輝度が100から130の範囲を拡大して表示した例を示します。この場合には1000倍した時には整数誤差で輝度分布が若干ばらつくのに対して、2バイトに割り戻した場合にはばらつきがかなり抑制されることが分かります。最終的には1バイトのデータに変換するため、データのばらつきに対しては裕度は高くなりますが、データの取り扱いの優位性と誤差が顕著に少なくなることの両面から、Yについての計算途中でのデータ精度は2バイトを採用することが好ましいと考えています。
 画像を取り扱うためには、色の変換だけではなく、画像内部の座標系の変換も必要になります。3次元形状モデルをディスプレイや印刷面などの2次元平面に投影する投影変換(projective transformation)はモデリングされた形状をディスプレイ表示あるいはプリンタ印刷の際に良く用いられます。3次元形状モデルが定義された局所座標系を、平行移動、回転移動、拡大・縮小変形などを行う変換が幾何変換(geometric transformation)で、異なる座標系でモデリングされたパーツを全体座標系で組合せるか分解する際に用いられます。視点の位置あるいは投影する方向(視線の方向)を移動・回転する変換が視野変換(viewing transformation)です。
 n次元空間上の点 P (x1, x2,…, xn) に対して新たな量Wを導入し以下の関係に基づいてn+1次元の直交座標系で各点 (X1, X2,…, Xn , W) を表現する方法を同次座標(homogeneous coordinate)表現と言います。わざわざ次元を増やすのは無駄に感じられるかもしれません。大雑把な説明をすると、平面にはいつくばった状態では平面の広さを実感できませんが、平面の外に出て平面を俯瞰的に眺めると、その平面を理解しやすくなります。このような感覚で同次座標系を考えればよいのではと思います。



 付け足しになりますが、A/D変換では、連続量である電圧信号を離散的なデジタル数値に変換します。このため、離散化誤差は避けることができません。変化率の大きい画像データに対してはビット数の小さい離散化でも見た目に大きな影響はありません。一方、微妙な変化しかしていないデータを離散化する場合には、変化量に対応した精緻なビット数で変換しなければ意味のある変換にはなりえません。
 換言すると、大雑把な変化を把握することが必要なときには細かいことには目をつむり、あまり変化が無いように見える局面では些細なところに注意が必要「悪魔は細部に潜む」と言うことです。パッと見たときの印象が以外に正確な判断となります。

次ページ   2014.10.10作成 2018.9.9改定

小川技研サイト
unsigned
・数学では、負の数は一般的にマイナス記号「−」を数値の前に付けることによって表します。コンピュータでは、負の数を表す方法は一種類とは限りません。
・8ビットの符号なし整数型の値の範囲は(0-255)、16ビットでは(0-65,535)となります。筆者は画像の演算ではすべて符号なし整数型を使用しています。大昔のPC98の時代に実用的な画像処理システムを作成するには、アセンブラで処理プログラムを作成せざるを得なかった時代の悪習です。
・定義域と値域、演算途中でのオーバーフロー・アンダーフローは起こさないように、かつ、最低限のメモリ使用を考える癖がついています。最近の人のプログラムを見ていると、演算処理速度の向上、メモリ空間の異常な拡大、データ深度の拡大などで、計算に余裕ができたせいか、あまり演算精度について考慮していないと感じています。
世代間誤差
 ネット検索が出始めた頃は自分の必要な情報を比較的簡単に検索できていました。最近は不必要な情報ばかりが検索結果上位に並び、欲しい情報がほとんど手に入らず、検索方法にてこずることが多いと感じるのは年のせいでしょうか。
 以下の4冊は消え行く世代の心情を理解するのにお勧めです。個人的には学生時代に手にしていた現代数学の著者がマンデルブロの兄上との意外な発見をしました
・フラクタリスト/マンデルブロ自伝, ベノワ・B.マンデルブロ, 田沢恭子/訳, 早川書房
・人はなぜ走るのか, ベルンド・ハインリッチ, 鈴木豊雄/訳, 清流出版
・ボッシュの子/ナチス・ドイツ兵とフランス人との間に生まれて, ジョジアーヌ・クリュゲー, 小沢君江/訳, 祥伝社
・プルーストの黙示録/『失われた時を求めて』と第一次世界大戦, 坂本浩也, 慶應義塾大学出版会