「構造編」も終りTEOプログラミングにも慣れてきましたか? 「アルゴリズム編」では,画像処理で頻繁に用いられるフィル タリングや画像の拡大・縮小の方法について扱います.この節の最後の 課題では今まで学習したことを応用してモザイク画像の生成を行います. なお本節ではソースは掲載しません.アルゴリズムとプログラミングの 際の注意事項を示しますので各自で挑戦してみて下さい.
この節の扱う課題の次のようになっています.
[アルゴリズム]
ラプラシンフィルタは画像の鮮鋭化やエッジ検出に使用されるフィルタ
です.ラプラシアンとは2次微分の意味です.画像の2次微分は次のよう
に行います.Bを注目画素とする.両隣の画素A, Cとの差分を
とすると,これらは次式で表
せる.ただし I(x, y)は点(x, y)での画素値とする.
|
(5.3) |
|
(5.4) |
画素Bに関する2次微分は,これらの1次微分値の差分として計算するこ とができます(式(5.5)).
|
(5.5) |
垂直方向の微分も同時に考えると,画素Bに関する2次微分は以下の式で 与えられます.
|
(5.6) |
この式の各画素の係数をその画素の配置に合わせて表現したのが図5.12(a)です.図 5.12(b)は更に斜め方向の微分も考慮したものです.これらをマス クやカーネルなどと呼びます.
![]() |
![]() |
(a) |
(b) |
[プログラミング]
ラプラシアンフィルタに限らず,フィルタリングでは処理可能な画像の 範囲を考慮することが重要です.今回のラプラシンフィルタでは,隣り 合った画素が存在しない,画像の端の画素は処理することができません. ですから,各画素にアクセスするためのループの初期値と最終値に注意 しなければいけません.
以下に示すのは,入力画像サイズと同じサイズで出力画像データを確保 した場合の例です.
for (row = TeoYstart (src) + 1; row <= TeoYend (src) - 1; row++) {
for (col = TeoXstart (src) + 1; col <= TeoXend (src) - 1; col++) {
...
}
}
[アルゴリズム]
ガウシアンフィルタもラプラシアンフィルタと同様よく知られたフィル タで,画像のノイズ除去を目的とした平滑化フィルタの一つです.一番 単純な平滑化は周囲の画素値の平均値を取ることです.これに対してガ ウシアンフィルタは画素の空間的配置を考慮して,対象画素に近い画素 に大きな重みを,対象画素から遠い画素には小さい重みを付けた加重平 均を取ります.この重み付けにガウス関数を採用していることからガウ シアンフィルタと呼ばれます.
図5.13に2次元のガウス関数を示します.標
準偏差
の値によって平滑化の度合を変
化させることができます.
![]() |
![]() |
(a) |
(b) |
, (a)
, (b) 
[プログラミング]
ガウシアンフィルタのカーネルの例を示します.
の値の他に,カーネルの大きさで平滑化の度
合を調整することも可能です.以下の例はカーネルサイズ 3 × 3,
の例です.図
5.14(a)はガウス関数の値をそのままカーネルに当てはめたもので
す.実際にはフィルタリング後の画素値の範囲ともとのデータの画素値
の範囲を合わせるために,カーネル中の値の総和が1になるように正規
化したもの(図5.14(b))を用います.
このようにカーネルの数値が変わるだけでラプラシアンフィルタやガウ シアンフィルタのように性質の異なるフィルタを表現できるわけです. カーネルを関数の引数に与えて,任意のフィルタリングを行う関数とい うのも作れそうですね.図5.15にその他のフィ ルタのカーネルをいくつか載せておきます.図 5.16にラプラシアンフィルタとガウシアンフィルタの出力結果を載 せておきます.自分の作成したプログラムの結果と比較してみて下さい.
![]() |
![]() |
(a) |
(b) |
![]() |
![]() |
![]() |
![]() |
(a) |
(b) |
(c) |
(d) |
![]() |
![]() |
![]() |
(a) |
(b) |
(c) |
[アルゴリズム]
ここでは拡大・縮小による画像の変換について扱います.画像変換の中 では単純なものですが,これができれば,ほとんどの変換は可能になる でしょう.
画像を2倍に拡大することを考えましょう.まず誰もが考える方法は,
入力画像の画素座標を2倍した位置に画素値を書き込む方法です.つま
り座標の変換は次の式で与えられます.ただし,(x,y)は入力画像の画
素座標,
は出力画像の
画素座標を表す.
|
(5.7) |
|
(5.8) |
この方法で画像を拡大した結果を図5.17に示 します.縦横に黒い線が入っています.これは座標の変換に問題がある からです.例えば,点(i,0), i = 0,...,Nの変換後の座標は点(2i,0)と なります.これでは点(2i+1, 0)の画素値が計算されません.このよう な点が黒い線となって現れたのです.このようなことを防ぐためには, 入力画像の画素座標から出力画像の画素座標を計算するのではなく,出 力画像の画素座標から入力画像の画素座標を計算すればよいのです.す なわち座標の変換式は次のようになります.
|
(5.9) |
|
(5.10) |
このように出力画像を中心に考えれば,変換後の画像に情報の欠落した 部分がなくなるわけです.拡大・縮小に関わらず,入力画像から出力画 像への変換式が与えられた時は,この変換の逆変換を求めて出力画像上 の点の入力画像での座標および画素値を計算します.
| 画像の変換は逆変換を用いて行う! |
[アルゴリズム]
画像の拡大・縮小プログラムはできましたか? 拡大画像は解像度が荒い ような感じの画像になっていませんか.それは画素座標が整数値である ことが原因です.つまり画像を2倍に拡大する場合,出力画像の座標が (1,0)の時,入力画像での座標は(0.5,0)となるが画素座標は整数値で あるので,(0,0)もしくは(1,0)となるためである.
これを解決する方法に双1次補間による画素値の内挿があります.計算
によって得られた画素座標が図5.18に示すよ
うに点(x,y), (x+1,y)を
に,点(x,y), (x,y+1)を
に内分する点である時,この点の画素値を次
式(5.11)で計算する.
|
(5.11) |
[プログラミング]
変換によって得られた実数値の画素座標
から式(5.11)中の
は以下のように計算できます.
|
(5.12) |
|
(5.13) |
|
(5.14) |
|
(5.15) |
![]() |
![]() |
| (a) | (b) |
[アルゴリズム]
アルゴリズム編最後の課題はモザイク画像の生成です.モザイク画像と は複数の画像を張り合わせて生成した,より高視野な画像のことです.
ある視点位置から平面または平面とみなせるもの(遠くのシーンを撮影 したような場合)を撮影した画像は,射影変換行列と呼ばれる3×3行列 によって異なる視点から撮影した画像へと変換することができる(式??). 射影変換行列を利用して,異なる視点で撮影した複数の画像を変換して つなぎ合わせることでモザイク画像を生成する.
|
(5.16) |
[プログラミング]
画像の拡大・縮小,画素値の内挿の課題で覚えたことを利用してモザイ ク画像を作成します.第1画像から第2画像への射影変換行列が与えられ ている場合を考えます.
与えられた射影変換行列の逆変換を求めて,第2画像の4隅の点 が第1画像上のどの座標に変換されるか計算します.そして,第 1画像の4隅の点と,変換された第2画像の4隅の点を内包する矩 形領域を出力画像のサイズとします(図5.20).
この際,出力画像の左上の座標が(0,0)でない場合も生じるが, TEO画像フォーマットではオフセット機能により,そのような場 合も問題なく扱うことができる.
第1画像と出力画像の座標系は一致していますので,第1画像上 の画素値を出力画像の同一座標に書き込みます.
(a) 出力画像の各点について,射影変換行列により第2画像での
座標を計算する.
(b) 計算された座標が第2画像の範囲外であれば何もしない.
(c) 計算された座標が第2画像の範囲内であれば,双1次補間によっ
て出力画像の画素値を計算し書き込む.
![]() |
![]() |
| (a) | (b) |
![]() |
| (c) |