第 4 章デジタル画像の処理 デジタル画像処理の基礎について理解し,Jv によるフィルタリング処理や座標変換のプログラムを作成する 4.1 RGB 表色系と CMY 表色系 TV やコンピュータのディスプレイ, デジタルカメラでの色の表現には, 加法混色 (RGB) が用いられる RGB の R は赤 (Red),G は緑 (Green),B は青 (Blue) であり, これらは光の 3 原色と呼ばれるものである R,G,B はそれぞれ,0~255 の 256(= 2 8 ) 個 ( すなわち,1 バイト = 8ビット ) のピクセル値 ( 整数 ) で表現される さらに,R,G,B の各ピクセル値を, 順に左から並べて連結させたもの (8 3 = 24 ビット ) は RGB 値と呼ばれ, これを 16 進表記で取り扱う また, この RGB 表色系に透明度 ( アルファチャンネル ) を加えた RGBA 表色系の他,sRGB や AdobeRGB などの RGB 色空間も定義されている 4-1
一方, 物体色 ( 色や光を反射して色刺激を起こすもの, つまり印刷物 ) の表現には, 減法混色 (CMY) が用いられる CMY の C はシアン (Cyn),M はマゼンタ (Mgent),Y はイエロー (Yellow) であり, これらは色の 3 原色と呼ばれるものである なお, 同じシアン, マゼンタ, イエローでも,RGB 表色系 ( 光の世界 ) のものとは色が異なっている 現実世界の物体色の表現法としては, この CMY 表色系にキーとなるブラック (Blck) を加えた CMYK 表色系を採用している これは, 綺麗な黒色を CMY だけの混色で表現することは理論上可能であるが, 実際には技術的に困難なためである 4-2
4.1.1 ピクセル値,RGB 値,webcolor の関係 16 進表記の RGB 値は,webcolor としても定義されている その対応関係 ( 例 ) を以下に示す (R, G, B) (10 進ピクセル値 ) RGB 値 (16 進表記 ) webcolor (0, 0, 0) 000000 blck (0, 0, 128) 000080 nvy (0, 0, 255) 0000 blue B 備考 (0, 128, 0) 008000 green ( 下記 参照 ) (0, 128, 128) 008080 tel (0, 255, 0) 0000 lime G( 下記 参照 ) (0, 255, 255) 00 qu(cyn) 光としてのシアン と同義 (128, 0, 0) 800000 mroon (128, 0, 128) 800080 purple (128, 128, 0) 808000 olive (128, 128, 128) 808080 gry (192, 192, 192) c0c0c0 silver (255, 0, 0) 0000 red R (255, 0, 255) 00 uchsi(mgent) 光としてのマゼンタ と同義 (255, 255, 0) 00 yellow 光としてのイエロー と同義 (255, 255, 255) white webcolor として指定する green は,RGB の G(webcolor として指定する lime) とは異なる 4-3
4.2 コンピュータにおけるカラー画像の処理 カラーのデジタル画像は,R,G,B の 3 つのピクセル値 (0~255 の整数 ) を持つピクセル ( 画素 ) から構成され, 画像のピクセル数は 画像の幅 画像の高さ ( 単位はピクセル ) で表記される データの圧縮が施されていないカラー画像では, ピクセル数 3 バイト分のメモリ ( 記憶領域 ) が必要になる 一方,JPEG などの圧縮画像では, エンコード ( 符号化 ) による圧縮でこのメモリを節減している また, 画像の各ピクセルの位置は,2 次元座標 ( 平面 ) 上で指定される ディスプレイの画面上における座標平面は, 左上が原点 (0, 0) であり, 画像の幅 (width) と高さ (height) の各方向はそれぞれ, 右向きと下向きが正 (+) の方向になる (0, 0) width height (width, height) 4-4
4.3 算術シフトを用いたピクセル値と RGB 値の求め方 画像中の各ピクセルの RGB 値から R,G,B の各ピクセル値を求める場合は算術右シフト (>>) を用いて計算させる 逆に,R,G,B の各ピクセル値から RGB 値を求めるには, 算術左シフト (<<) を用いて計算させる 4.3.1 算術右シフトによるピクセル値の計算方法 画像中のあるピクセルの RGB 値に対する R,G,B の各ピクセル値は, 下記のようにして計算できる ( 但し下記の rgb は int 型変数で,RGB 値が入っているものとする ) R のピクセル値は (rgb >> 16) & 0x000000 G のピクセル値は (rgb >> 8) & 0x000000 B のピクセル値は rgb & 0x000000 16 ビット右シフトして抽出 8 ビット右シフトして抽出 下位 8 ビットをそのまま抽出 0x ( 頭に 0x が付いている数 ) は 16 進表記の値をあらわす BueredImge クラスの getrgb メソッド ( 後述 ) は, デフォルト RGB カラーモデル TYPE_INT_ARGB およびデフォルト srgb カラースペースのピクセルを int 型で返す (4 バイト = 32 ビット, 但し上位 1 バイト分は 0 と考える ) 4.3.2 算術左シフトによるピクセル値の計算方法 画像中のあるピクセルにおける R,G,B の各ピクセル値に対する RGB 値は, 下記のようにして計算できる (R と G に対して上記とは逆の操作を行い, 論理和で足し合わせればよい ) ( R のピクセル値 << 16) ( G のピクセル値 << 8) B のピクセル値 4-5
4.4 画像ファイルの読み込みと出力 画像 ( イメージ ) は jv.wt.imge パッケージの BueredImge クラスで扱い, 画像ファイルからイメージの読み込み ( 画像入力 ) および表示 ( 画像出力 ) には jvx.imgeio パッケージの下記メソッドを使用する ( なお,File クラスへの画像ファイルの入出力のために jv.io パッケージも必要 ) 扱えるイメージ形式には jpg や gi などがある メソッド red 記述例 (jv.io.* と jv.wt.imge.* と jvx.imgeio.* をインポートした場合 ) 画像ファイル myimge.jpg をインスタンス bi として画像読み込みする ( 記述例 ) File = new File("myimge.jpg"); BueredImge bi = ImgeIO.red(); write インスタンス bi を画像ファイル newimge.jpg として画像出力する ( 記述例 ) BueredImge bi; File = new File("newimge.jpg"); ImgeIO.write(bi, "jpg", ); 4-6
4.5 画像データの取得 画像ファイルより, その画像の幅 (width) と高さ (height), 画像中のある座標における RGB 値を取得するための,jv.wt.imge.BueredImge のメソッドとして下記がある メソッド getwidth 説明と記述例 画像ファイルのインスタンス imge から, その画像の幅 ( 単位 : ピクセル ) を整数値 (int 型 ) で取得 ( 記述例 ) int width = imge.getwidth(); getheight 画像ファイルのインスタンス imge から, その画像の高さ ( 単位 : ピクセル ) を整数値 (int 型 ) で取得 ( 記述例 ) int height = imge.getheight(); getrgb 画像ファイルのインスタンス imge から, 指定したピクセル ( 画素 ) の RGB 値を int 型で取得 ( 記述例 ) int rgb = imge.getrgb(x, y); // x,y は画像中の座標 上記 rgb( 座標 (x, y)) に対する R,G,B 各値の求め方 ( 詳細は 4.3.1 節を参照 ) R の場合 : (rgb >> 16) & 0x000000 G の場合 : (rgb >> 8) & 0x000000 B の場合 : rgb & 0x000000 4-7
4.6 画像データの設定 画像ファイルに, 画像中のある座標における RGB 値を設定するための,jv.wt.imge. BueredImge のメソッドとして下記がある メソッド setrgb 説明と記述例 画像ファイルのインスタンス imge に, 指定したピクセル ( 画素 ) の RGB 値を設定 ( 記述例 ) imge.setrgb(x, y, rgb); // 引数 x,y は画像中の座標,rgb は新しく設定する rgb 値 上記 rgb( 座標 (x, y)) には新しく設定する RGB 値が入る ( 詳細は 4.3.2 節を参照 ) 4-8
4.7 近傍処理を用いたフィルタリング 画像内に含まれる雑音を除去したりする操作をフィルタリングと呼び, デジタル画像空間において直接操作する空間フィルタがある 空間フィルタは近傍処理 ( 入力画像 1 座標とその近傍座標の RGB 値を使用して, 出力画像の 1 座標の RGB を決定する処理 ) によって実行される 近傍処理におけるピクセルと配列表現の関係を下記に示す M 画素 N 画素 i [0,0] [1,0] [N-1,0] [0,1] j [0,M-1] [N-1,M-1] M*N pic の画像 配列表現 近傍処理は入力画像における 1 座標とその近傍のピクセルの RGB 値にある重み ( オペレータ ) を付け, それらの和の結果を出力画像の 1 座標の RGB 値とする これらを積和演算と呼ぶ 3 3 の場合の重み係数行列を 11 21 31 12 22 32 13 23 33 ( 但し s t 1 ), また, 座標 ( i, におけるピクセル値を P( i, であらわすとき, 近傍処理 st 適用後の座標 ( i, におけるピクセル値 P( i, は次式で計算できる P ( i, P( i 1, j 1) P( i 1, 11 21 P( i 1, j 1) P( i, j 1) P( i, 31 22 12 P( i, j 1) P( i 1, j 1) P( i 1, 32 23 13 P( i 1, j 1) 33 4-9
4.7.1 オペレータの種類 ここでは, 代表的なものとして, 平滑化オペレータと鮮鋭化オペレータについて紹介する 平滑化オペレータ 鮮鋭化オペレータ ( 例 ) 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 ( 例 ) -1-1 -1-1 9-1 -1-1 -1 double [][] ilter ={ {0.111, 0.111, 0.111}, {0.111, 0.111, 0.111}, {0.111, 0.111, 0.111} }; double [][] ilter ={ {-1, -1, -1}, {-1, 9, -1}, {-1, -1, -1} }; 平滑化 : ノイズ等の規則雑音を軽減する ( 高い周波数成分を除去する ) 雑音除去をする一方, 画像がボケる 鮮鋭化 : 高い周波数成分を強調する ボケた画像を鮮鋭化する ( 画質改善の一種 ) その他にもさまざまな種類のオペレータがある ( さらに詳細について知りたい場合は, 各自勉強すること ) 4.7.2 外縁での近傍処理 1 座標 ( i, を左上より走査しながら実行するが, 外縁のピクセル ( i 0 あるいは i M 1; j 0 あるいは j N 1 ) は周辺のピクセルが欠けているため計算ができない このため, 該当条件を含む近傍処理では, 入力画像の RGB 値をそのまま出力画像に反映する ( つまり, 近傍処理は行わない ) 4-10
4-11 4.8 アフィン変換拡大, 縮小, 回転, 反転のように, 行列で表現される変換と, ベクトルで表現される平行移動を組み合わせて統一的に扱う変換を, アフィン変換 (Aine trnsormtion) と呼ぶ 変換前の座標を ), ( j i, 変換後の座標を ), ( j i とするとき,6 つのパラメータを用いて, 次式のような形で一括して, 画像に含まれる各ピクセルの座標を変換できる 2 22 21 1 12 11 2 1 22 21 12 11 b j i b j i b b j i j i
特に, 11 21 12 22 cos sin sin p cos 0 0 q p cos psin qsin q cos b1 s, b2 t すなわち i j p cos i q sin j psin i q cos j s t の場合, 次のような変換になる (step1) 水平方向に p 倍, 垂直方向に q 倍 (step2) 時計回り ( ) に 回転 (step3) 水平方向に s, 垂直方向に t, それぞれ平行移動 O w s pw t O h qh ディスプレイ上では, 水平方向 ( 幅 ) は右向きが+, 垂直方向 ( 高さ ) は下向きが+ 上記の場合, 回転は時計回りが+になる (C. 通常の座標平面上では反時計回りが+) 4-12