第 4 章 画像処理入門 2
~ アルゴリズム入門 ~
サンプルプログラムのダウンロード (msdnaa_algorithm04.exe、122 KB)
4.1 はじめに
近年の情報技術の発達に伴い、コンピュータによる画像処理技術も大きく進歩しました。画像処理技術は、医療、工業、そしてマスメディアなど様々な分野で活用されています。第 3 章で画像処理技術を解説しましたが、それだけでは高精度の画像処理システムは開発できません。一般の画像には、多くの場合、不必要な成分が含まれており、その成分を除去しなければ高精度の画像処理が行えないためです。また、3 次元 CG に 2 次元画像をテクスチャとして貼り付ける処理や、衛星画像や航空写真を地図と対応させる場合などには、画像を幾何学的に変換する必要があります。
そこで、本章では、画像処理を高精度に行うために画像の不必要な成分を除去する雑音処理と、様々な分野に利用用途を広げるための幾何学変換処理について解説します。
4.2 雑音処理
第 3 章でも説明したように画像処理には、画像から特定の領域を取り出す閾値処理やエッジ検出などがあります。これらの基本技術を応用することにより、医療におけるレントゲン写真の解析、工業における部品の自動認識、そしてセキュリティ分野における顔認証などのシステムが実現可能になります。しかし、高精度の画像処理を行うには、画像内の不必要な成分を取り除く必要があります。本節では、この不必要な成分を取り除くための雑音処理について解説します。雑音処理の例を図 1 に示します。
.gif)
図 1 雑音処理の例
4.2.1 雑音とは
画像は、撮影方法やレンズの歪みなどの要因により、劣化します。画像の劣化とは、実物に対して画像の精度が悪化することです。例えば、テレビは、アンテナの調子が悪い時などに画像がぼやけて見にくくなります。この画像の劣化には、目的の画像そのものが歪む劣化と、目的の画像の上に画像と関係の無い成分が乗る劣化の2種類があります。この画像と関係の無い成分のことを雑音と言います。雑音の代表的なものにインパルス雑音とガウス雑音があります。本章では、雑音の発生にインパルス雑音を利用します。
(1) インパルス雑音
画像の不規則な場所に不規則な大きさで発生する雑音をインパルス雑音と言います。インパルス雑音を画像上に意図的に発生させる場合は、一定の確率で画素の値を白や黒に置き換えます。インパルス雑音の例を図 2 に示します。
.jpg)
図 2 インパルス雑音
(2) ガウス雑音
発生確率にガウス分布を用いて発生させた雑音をガウス雑音と言います。ガウス雑音は、分布長が一般的に短い雑音です。ガウス分布を次に示します。
.gif)
p(x) : 確率密度関数、σ² : 雑音の分散、μ : 雑音の平均値 (期待値)
σ²=400、μ=0 のガウス雑音の例を図 3 に示します。
.jpg)
図 3 ガウス雑音
4.2.2 雑音処理
雑音処理は、動画と静止画で手法が異なります。動画の雑音処理では、雑音が時間によってランダムに変化します。そのため、動画の雑音は、時間的にランダムである性質を利用することにより、複数の画像をもとに取り除くことができます。しかし、雑音を含んだ 1 枚の静止画の雑音処理では、雑音によって隠されてしまった画素の値は知ることができません。そのため、視覚的に雑音を感じないように画像を補間することが、静止画の雑音処理です。
画像は、独立した正方形の画素が集まって構成されています。そのため、不規則に発生した雑音の濃度 (色の明るさ) は、周りの濃度と急激な差を生じます。雑音処理とは、この濃度差を周りに対して差がないようにすることです。しかし、画像のエッジ部分も急激な濃度差を持っているため、エッジ部分と雑音をうまく区別することが重要になります。このように雑音を除去する処理を平滑化またはスムージングと呼びます。
(1) 移動平均法による雑音処理
移動平均法による雑音処理とは、ある画素の値を周辺の値の平均値に設定する手法です。この手法には、全画素に対して値を変更するため、雑音だけでなくエッジもぼかしてしまう欠点があります。移動平均法による雑音処理を図 4 に示します。
.gif)
図 4 移動平均法による雑音処理
(2) メディアン フィルタによる雑音処理
メディアン フィルタによる雑音処理とは、移動平均法が雑音と一緒にエッジをぼかすのに対し、雑音のみをぼかすことができる手法です。そのため、メディアン フィルタによる雑音処理は、今日最もよく利用されています。手順としては、ある画素の周辺の値をソートし、その中央値を値に設定します。メディアン フィルタによる雑音処理を図 5 に示します。
.gif)
図 5 メディアン フィルタによる雑音処理
4.2.3 雑音処理プログラム
本プログラムでは、モノクロ画像に対して、メディアン フィルタを利用した雑音処理を行います。まず、画像の各画素と 8 方向に隣接する画素の色情報を取得します。次に、取得した色情報の中央値を算出します。最後に、取得した色情報をピクセルに設定します。
private void MedianSmooth()
{
(中略)
// メディアン フィルタによる雑音除去
for(i = 1; i < pictureBox1.Image.Width - 1; i++)
for(j = 1; j < pictureBox1.Image.Height - 1; j++)
{
// 左上画素の色情報取得
iArrayValue[0] = bBitmap.GetPixel(i - 1, j - 1).B;
// 左画素の色情報取得
iArrayValue[1] = bBitmap.GetPixel(i - 1, j).B;
// 左下画素の色情報取得
iArrayValue[2] = bBitmap.GetPixel(i - 1, j + 1).B;
// 上画素の色情報取得
iArrayValue[3] = bBitmap.GetPixel(i, j - 1).B;
// 現在の画素の色情報取得
iArrayValue[4] = bBitmap.GetPixel(i, j).B;
// 下画素の色情報取得
iArrayValue[5] = bBitmap.GetPixel(i, j + 1).B;
// 右上画素の色情報取得
iArrayValue[6] = bBitmap.GetPixel(i + 1, j - 1).B;
// 右画素の色情報取得
iArrayValue[7] = bBitmap.GetPixel(i + 1, j).B;
// 右下画素の色情報取得
iArrayValue[8] = bBitmap.GetPixel(i + 1, j + 1).B;
iResult = Median_sub(ref iArrayValue); // 中央値の算出
// 中央値による色の設定
cSetColor = Color.FromArgb(iResult, iResult, iResult);
bBitmap.SetPixel(i, j, cSetColor); // ピクセルの色の設定
}
pictureBox1.Image = bBitmap; // 変換結果の設定
}
private int Median_sub(ref int[] iArray)
{
int i, j; // 繰り返し処理用変数
int iTemp; // 交換用テンポラリ領域
// 中央値の算出
for(i = 0; i < 8; i++
for(j = 0; j < 8; j++)
{
// 次の値の方が小さい場合
if(iArray[j + 1] < iArray[j])
{
iTemp = iArray[j + 1]; // 数値の保持
iArray[j + 1] = iArray[j]; // 数値の代入
iArray[j] = iTemp; // 保持した数値の設定
}
}
return iArray[4]; // 戻り値
}
本プログラムの実行結果を図 6 に示します。
.jpg)
図 6 実行結果
4.3 幾何学変換処理
今日、画像は、テレビの演出などのマルチメディア分野、衛星画像や航空写真を用いた地図作成などの土木・測量分野、レントゲン写真などの医療分野など様々な分野で利用されています。このような分野の画像には、画像の形状変更を行う幾何学変換処理がよく利用されています。例えば、3 次元 CG に 2 次元画像をテクスチャとして貼り付ける処理や、衛星画像や航空写真を地図と対応させる処理が挙げられます。この処理には、画像の大きさの変更だけでなく、回転や投影などの様々な形状変更が必要になります。また、幾何学変換処理は、カメラのレンズなどによる歪みを補正する時などにも利用されます。本節では、この幾何学変換処理について解説します。
4.3.1 幾何学変換処理とは
幾何学変換処理とは、画像の形状を変更することです。本項では、画像の形状を変更するために良く用いられる画像の拡大・縮小、移動、回転について解説します。
(1) 画像の拡大・縮小
画像の拡大・縮小は、すべての画素の値を x 方向に α 倍、y 方向に β 倍の位置に移動することによって実現できます。ある画素 (x,y) が x 方向に α 倍、y 方向に β 倍、拡大・縮小した画素 (X,Y) を次に示します。
.gif)
上記の式は、入力画像から出力画像の情報を取得します。しかし、画像処理では、出力画像から入力画像を求める逆変換を利用することがあります。拡大・縮小の逆変換を次に示します。
.gif)
(2) 画像の移動
画像の移動は、すべての画素の値を x 方向に xº、y 方向に yº 移動させることで実現できます。ある画素 (x,y) が x 方向に xº、y 方向に yº 移動した画素 (X,Y) を次に示します。
.gif)
移動の逆変換を次に示します。
.gif)
(3) 画像の回転
画像の回転は、すべての画素の値を角度 θ 回転させることで実現できます。ある画素 (x,y) が角度 θ 回転した画素 (X,Y) を次に示します。
.gif)
回転の逆変換を次に示します。
.gif)
4.3.2 補間処理とは
画像の幾何学変換は、単純に上記の公式を各画素に適用するだけでは実現できません。なぜなら、画像は正方形の各画素が独立して色情報を持っているため、小数点を含む画素には、色情報を設定できないからです。そのため、色情報を持たない各画素に対して、色情報を設定する必要があります。この処理を補間処理と言います。補間処理の必要性を図 7 に示します。
.gif)
図 7 補間処理の必要性
(1) 最近傍法とは
補間処理の手法の一つに最近傍法があります。最近傍法とは、ある画素の周辺で一番近い画素の値を設定する手法です。最近傍法は、処理速度が高速であると言うメリットがありますが、画像によっては補間精度が低いというデメリットもあります。最近傍法の概念を図 8 に示します。
.gif)
図 8 最近傍法の概念
(2) 線形補間法とは
線形補間法とは、最近傍法が周りの 1 つの画素のみから値を決定しているのに対し、周りの最も近い 4 つの画素から値を設定する手法です。そのため、線形補間法は、最近傍法に比べ補間精度が非常に高く、今日最も利用されている補間処理です。線形補間法の概念を図 9 に示します。
.gif)
図 9 線形補間法の概念
4.3.3 幾何学変換処理プログラム
本プログラムでは、モノクロ画像に対して、拡大・縮小、移動、回転を行った後、線形補間法で補間します。まず、指定された角度をラジアンに変換し、そのコサイン値とサイン値を算出します。次に、算出したラジアンに基づいて画素の回転変換を行います。その際に、指定された移動量と拡大率の反映も行います。そして、上下左右の 4 近傍から設定する色情報を算出します。最後に、算出結果より色を作成し、表示します。
private void ImageConversion(double dDegree, double dExpX,
double dExpY, int iMoveValX, int iMoveValY)
{
(中略)
dAngle = dDegree * Math.PI / 180; // ラジアンの算出
dCos = Math.Cos(dAngle); // コサイン値の算出
dSin = Math.Sin(dAngle); // サイン値の算出
// 画像の幾何変換
for(i = -iHalfY; i < iHalfY; i++)
for(j = -iHalfX; j < iHalfX; j++)
{
iMoveY = i - iMoveValY; // 縦方向への移動量の反映
iMoveX = j - iMoveValX; // 横方向への移動量の反映
// Y 座標の回転変換と縦方向への拡大率の反映
dY = (iMoveX * dSin + iMoveY * dCos) / dExpY;
// X座標の回転変換と横方向への拡大率の反映
dX = (iMoveX * dCos - iMoveY * dSin) / dExpX;
// Y 座標が 0 より大きい場合
if(dY > 0)
iTempY = (int)dY; // 数値の設定
// Y 座標が 0 以下の場合
else
iTempY = (int)(dY - 1); // 数値の設定
// X 座標が 0 より大きい場合
if(dX > 0)
iTempX = (int)dX; // 数値の設定
// X 座標が 0 以下の場合
else
iTempX = (int)dX - 1; // 数値の設定
dValY = dY - iTempY; // 変換前後の Y 座標の差分算出
dValX = dX - iTempX; // 変換前後の X 座標の差分算出
// 設定色情報を取得する場合
if((iTempY >= -iHalfY) && (iTempY < iHalfY - 1) && (iTempX >=
-iHalfX) && (iTempX < iHalfX - 1))
iResult = (int)((1.0 - dValY) * ((1.0 - dValX) *
bBitmap.GetPixel(iTempX + iHalfX, iTempY +
iHalfY).B + dValX * bBitmap.GetPixel(iTempX
+ iHalfX, iTempY + 1 + iHalfY).B)
+ dValY * ((1.0 - dValX) *
bBitmap.GetPixel(iTempX + 1 + iHalfX, iTempY
+ iHalfY).B + dValX *
bBitmap.GetPixel(iTempX + 1 + iHalfX,
iTempY + 1 + iHalfY).B));// 色情報の取得
// 設定色情報を取得しない場合
else
iResult = 0; // 0 に設定
// iResultが0より小さい場合
if(iResult < 0)
iResult = 0; // 0 に設定
// iResultが255より大きい場合
if(iResult > 255)
iResult = 255; // 255 に設定
iBitDatas[j + iHalfX, i + iHalfY] = iResult;// 算出結果の格納
}
// 変換結果の表示
for(i = 0; i < pictureBox1.Image.Width; i++)
for(j = 0; j < pictureBox1.Image.Height; j++)
{
cSetColor = Color.FromArgb(iBitDatas[i, j], iBitDatas[i, j],
iBitDatas[i, j]);// iArrayBitData値による色の設定
bBitmap.SetPixel(i, j, cSetColor); // ピクセルの色の設定
}
pictureBox1.Image = bBitmap; // 変換結果の設定
}
本プログラムの実行結果を図 10 に示します。
.jpg)
図 10 実行結果
4.4 まとめ
本章では、前章で解説した閾値処理、ラベリング処理、そしてエッジ検出の発展として、雑音処理、幾何学変換処理を解説しました。その結果、様々な画像処理アルゴリズムも Visual C# のクラスやメソッドを用いることで、非常に短いコードで記述できました。このように、Visual C# には、画像処理を行う上で汎用的で便利なクラスやメソッドが豊富に用意されているため、高度な情報処理システムも効率良く作成できます。
次回の連載では、知識情報処理の代表的な手法である遺伝的アルゴリズム (GA) について解説します。
アルゴリズム入門
本連載は、テキスト処理、グラフィック処理、画像処理、知識情報処理などのアルゴリズムを Visual C# を用いて解説します。
著者略歴
田中 成典 (たなか しげのり)
| 1986 年 | 関西大学工学部土木工学科卒業 |
| 1988 年 | 関西大学大学院工学研究科 土木工学専攻博士課程前期課程修了 |
| 1996 年 | 博士 (工学) 授与,関西大学 |
| 1997 年 | 関西大学総合情報学部助教授 (現在に至る) |
| 主な著書: | やさしい C のはじめかた,オーム社,1993 年 |
| | 建設技術者のための知識情報処理の実践,関西大学出版部,1999 年 |
| | DirectX8,工学社,2001 年 |
| | ステップアップ XML,工学社,2002 年 |
| | Linux アプリケーション入門,森北出版,2002年 ほか |
中山 浩太郎 (なかやま こうたろう)
| 2001 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
| 2003 年 3 月 | 関西大学大学院総合情報学研究科 博士課程前期課程修了 |
| 2003 年 4 月 | 関西大学大学院総合情報学研究科 博士課程後期課程入学 (現在に至る) |
| 主な著書: | Web 工房シリーズ Perl の達人,森北出版,1999 年 |
| | 決定版 Visual Basic,共立出版,2000年 |
| | DirectX8,工学社,2001 年 |
| | Linux アプリケーション入門,森北出版,2002 年 |
| | ステップアップ Visual C# .NET 入門,工学社,2002 年 ほか |
中村 健二 (なかむら けんじ)
| 2000 年 4 月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
| 主な著書: | DirectX8 & VC++ 3D の基礎とゲームの作り方,工学社,2002年 |
北川 悦司 (きたがわ えつじ)
| 2000 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
| 2002 年 3 月 | 関西大学大学院総合情報学研究科 博士課程前期課程修了 |
| 2002 年 4 月 | 関西大学大学院総合情報学研究科 博士課程後期課程入学 (現在に至る) |
| 主な著書: | Web 工房シリーズ Java の達人,森北出版,1999 年 |
| | デジカメ活用によるデジタル写真測量入門,森北出版,2000 年 |
| | ステップアップ XML 活用法,工学社,2002 年 |
上山 智士 (うえやま さとし)
| 2002 年 4 月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
杉町 敏之 (すぎまち としゆき)
| 2003 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
| 2003 年 4 月 | 関西大学大学院総合情報学研究科入学 (現在に至る) |
| 主な著書: | ステップアップ Visual C# .NET 入門,工学社,2002 年 |
野中 一希 (のなか かずき)
| 2003 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
| 2003 年 4 月 | 関西大学大学院総合情報学研究科入学 (現在に至る) |
| 主な著書: | ステップアップ Visual C# .NET 入門,工学社,2002 年 |
ページのトップへ