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