ラベル Image processing の投稿を表示しています。 すべての投稿を表示
ラベル Image processing の投稿を表示しています。 すべての投稿を表示

2010年3月9日火曜日

画像処理 #0 新装版のお知らせ

20回以上に渡り連載した画像処理ですが,ここら辺で新しく書き直します.
書き直す度に以前の投稿を削除しますが,御容赦を.また,連載の順番も入れ替えるので,暫くの間カオスになりますが,これもまた御容赦を.

2009年8月16日日曜日

画像処理 #22 細線化

本日は,2値化画像の細線化.

最近では電車内でもやってる人を見ますね.脳トレの一種でしょうか.



では,その手法を….

まず,黒画素=1,白画素=0とします.
全画素に対して,ラスタスキャン(つまるところ,1ピクセルずつ見ていくわけです)を行い,注目画素中心に,3x3の範囲を観察し,以下の条件を満たした時,その画素を白画素にします.
1.境界上にある黒画素である.
2.白画素に変更しても,連結性が保たれる.
3.端点で無い.

画素値を更新する方法として,逐次法,並列法があります.
逐次法(sequential method)は,更新した画像をそのまま使い,次処理に移るのに対し,
並列法(parallel method)では,消去可能かどうかを検証する検証用画像と,画素値の更新を行う更新用画像を別々に持ち,更新用画像に結果を反映していきます.そして,全画素の処理が終了したら,更新用画像を,次処理の検証用画像とします.

今回は,並列法を用います.
また,サブサイクル1,サブサイクル2を交互に行います.それぞれの挙動は以下.
サブサイクル1 - 右上から,左下に向かいラスタスキャン.
サブサイクル2 - 左下から,右上に向かいラスタスキャン.

そして,ラスタスキャンをしながら,論理フィルタ(logical filter)を用いて,
上記の1,2,3の条件を満たすかどうかを判断します.
(*は0,1どちらでもよいことを意味します.)

*0*
*1*
***
***
*10
***

サブサイクル1において,消去する場合


*0*
*11
*10
01*
110
***

***
010
*1*
*0*
11*
*0*
*1*
010
***
*0*
*11
*0*

***
01*
10*
10*
01*
***
*01
*10
***
***
*10
*01

010
111
0*0
010
*11
010
0*0
111
010
010
11*
010

サブサイクル1において,消去しない場合


***
*1*
*0*
***
01*
***

サブサイクル2において,消去する場合


01*
11*
*0*
***
011
*10

***
010
*1*
*0*
11*
*0*
*1*
010
***
*0*
*11
*0*

***
01*
10*
10*
01*
***
*01
*10
***
***
*10
*01

010
111
0*0
010
*11
010
0*0
111
010
010
11*
010

サブサイクル2において,消去しない場合


上のフィルタでは,
“消去する”に当てはまり,かつ,“消去しない”に当てはまらない場合のみ,黒画素(1)を消去(白画素(0)にする)します.

サブサイクル1,サブサイクル2を交互に繰り返し,更新(消去)する画素が無くなった場合,細線化処理を終了します.

例:


Fig.1
この画像を細線化すると,Fig.2のようになります.


Fig.2

こんな感じになります.きれいな細線化では無いですが,ちゃんと出来ています.

次は,細線の特徴点抽出について…

2009年8月15日土曜日

画像処理 #21 グレースケール化

2値化はよく行いますが,カラー画像からグレースケール画像に変換するという事をやっていなかったので紹介.

以下では,
Y:グレースケール値
R:Redの値
G:Greenの値
B:Blueの値

・単純平均法(simple mean method)
Y = (R+G+B)/3

真っ先に思いつくのがこの方法な気がします.

・中間値法(middle value)
Y = (min+max)/2
min = min(R, G, B)
max = max(R, G, B)

・Gチャンネル法
Y = G

R,G,Bの内,人間の心理物理量はGが7割程度を占める為,そのまんまGを当てはめてしまおうというものです.

・NTSC係数による加重平均法(NTSC Coef. method)
Y = 0.298912*R + 0.586611*G + 0.114478*B

NTSC:National Television System Committeeは,
アナログテレビジョン放送標準方式の規格を意味します.

・HDTV係数による加重平均と補正法(ITU Coef. method)
X = 2.2
R = (R^X) * 0.222015
G = (G^X) * 0.706655
B = (B^X) * 0.071330
Y = (R+G+B) ^ (1/X)

HDTV:High Definition Televisionは,
高精細度テレビジョン放送のことを意味します.

では,実際の例を示します.





Fig.1 sample





Fig.2 simple mean method





Fig.3 middle value





Fig.4 G channel method





Fig.5 NTSC Coef. method





Fig.6 ITU Coef. method

NTSC(Fig.5),HDTV(Fig.6)がいいセンいってます.middle value(Fig.3)は,(色相を変化させた方を見ると)黄色も青も一緒の明るさになっていて,再現度は低いといえます.simple mean method(Fig.2)もあまり良くないです.G channel(Fig.4)はパッと見良さそうに見えますが,それは気のせいというものです.
というわけで,グレースケール化する際には(他にも)色々と手法がある(らしい)ので注意しましょう.




おまけ:グレースケール化のガイドライン

面接官「特技はグレースケール化とありますが?」
学生 「はい。グレースケール化です。」
面接官「グレースケール化とは何のことですか?」
学生 「画像処理です。」
面接官「え、画像処理?」
学生 「はい。画像処理です。カラー画像をグレースケール画像にする事が出来ます。」
面接官「・・・で、そのグレースケール化は当社において働くうえで何のメリットがあるとお考えですか?」
学生 「はい。カラー画像をグレースケール化する際困りません。」
面接官「いや、当社にはグレースケール化をしようとする輩はいません。」
学生 「でも、グレースケール化楽しいですよ。」
面接官「いや、楽しいとかそういう問題じゃなくてですね・・・」
学生 「Gチャンネル法とかあるんですよ。」
面接官「ふざけないでください。それにGチャンネル法って何ですか。だいたい・・・」
学生 「Gチャンネル法です。“爺ちゃん寝る”が語源でして、R、G、Bの内、心理物理量7割を占めるGチャンネルをそのまま・・・」
面接官「聞いてません。帰って下さい。」
学生 「あれあれ?怒らせていいんですか?使いますよ。グレースケール化。」
面接官「いいですよ。使って下さい。グレースケール化とやらを。それで満足したら帰って下さい。」
学生 「運がよかったな。今日はカラー画像がないみたいだ。」
面接官「帰れよ。」

二番煎じ.

2009年8月3日月曜日

画像処理 #20 雲

皆さんは,雲を作ったことがあるでしょうか.

実際に作ってみました.

この記事は,下記の参考文献の内容を実装した後,日本語で要約したものです.

1.乱数でノイズパターンを生成


Fig.1
こんな感じで4つ作ります.赤枠は単に区切るためのものです.これらをそれぞれMap1,Map2,Map3,Map4とします.

2.平均化
Map1,Map2,Map3,Map4をそれぞれ平均化します.
平均化の際,上下左右は繋がっているものとしましょう.


Fig.2

3.サンプリング
以下のようにして,Map1,2,3,4を256x256の大きさにします.
Map1:8倍に拡大.
Map2:4倍に拡大したものを,タイル状に縦横2つずつ並べる.
Map3:2倍に拡大したものを,タイル状に縦横4つずつ並べる.
Map4:タイル状に縦横8つずつ並べる.
サンプリング時には,バイリニア補間を使いました(画像処理 第1回 補間 参照).
因みに,上で述べたように,上下左右が繋がっているものとして平均化しておかないと,この時点で不自然な不連続部分が出来てしまします.


Fig.3

4.合成
これらの画像を合成します.各ピクセルの値は,
Map=Map1+Map2/2+Map3/4+Map4/8
とします.


Fig.4

5.仕上げ

最後に仕上げです.各ピクセルについて,


CloudExpCurve(v){
c=v-CloudCover;
if(c<0)
c=0;
CloudDensity=255-CloudSharpnessc * 255;
return CloudDensity;
}


というトーンカーブを適用します.

ここで,パラメタの説明を.

CloudCover:
値域[0, 255]
総雲量を制御.値が小さい程,雲は多くなる.

CloudSharpness:
値域[0, 1]
雲のシャープさを変える.小さい値だと急激な変化で濃い雲,大きい値だと曖昧で薄い雲となる.


Fig.5

Fog.5でのパラメタは,以下の通り.
CloudCover=232
CloudSharpness=0.95

完成です.それっぽい感じの雲が出来上がりました.

参考文献
Hugo Elias.“Cloud Cover”.<http://freespace.virgin.net/hugo.elias/models/m_clouds.htm>.The good-looking textured light-sourced bouncy fun smart and stretchy page.(参照2009年8月2日)

2009年7月3日金曜日

画像処理 #19 肉を置け

例えば,次のような自体に出くわすかも知れません.

「文字画像に平均化フィルタが欠けてあって読めない」

今回は,そんな問題を打開する術を探す,そんな時間です.

まず,サンプル画像がこのようなものだったとしましょう.


Fig.1 Put some meat

では,平均化フィルタをかけてみます.


Fig.2 平均化フィルタ(w=8)


Fig.3 平均化フィルタ(w=16)

w=8の方は,ギリギリ読めますが,w=16の方はもう分かりません.
では,これらの画像をフィルタリングすることで,読めるようになるか実験してみましょう.

使うフィルタ
・鮮鋭化フィルタ
・ラプラシアンフィルタ
・LOGフィルタ

まずは,Fig.2を復元できるかやってみましょう.


Rig.4 鮮鋭化フィルタ
1回,2回,3回と適用しています.


Fig.5 ラプラシアンフィルタ
上は,ゼロ交差,下は,フィルタ後の値を正,0,負によって,色分けしたものです.
下の画像の方がなんとなく復元出来ているように感じます.


Fig.6 LOGフィルタ
上から,σ=1,1.2,1.4,1.8です.中々よい感じに復元できています.

次に,Fig.3がどの程度まで復元できるか.やってみましょう.


Fig.7 鮮鋭化フィルタ
残念.全く歯が立ちません.


Fig.8 ラプラシアンフィルタ
文字の様に見えなくもないですが,これは読めないですね.


Fig.9 LOGフィルタ
LOGフィルタがやってくれました.ノイズ混じりですが,「肉を置け」のように読めます.
ここで,元画像Fig.3を見てほしいのですが,あのボヤボヤ画像から,ここまで復元できるのは驚異的に感じます.

2009年6月29日月曜日

画像処理 #18 ハーフトーニング

2値画像ネタです.

先日の2値化では,ある閾値を設け,それより画素値が高いか否かで白黒判断していました.
しかし,それだと満足しない方もおられるはず.

というわけで,ハーフトーニング.渇いた喉を潤してくれます.
簡単に言うと,白黒の2値だけで,濃淡の微妙な変化を表現しようというものです.
スクリーントーンとかは正にそれです.

・濃度パターン法(density pattern method)
1つのグレースケール画素を複数の2値画像で表現します.
例えば,1画素を4x4画素の2値画像で表現するとすると,256階調を17分割することができます.


Fig.1

こんな感じ.
1画素を4x4画素で表現するので,入力画像がWxH画素の場合,出力画像4Wx4H画素となります.

・ディザ法(dither method)
ディザパターンというものを使う方法です.


Fig.2 Dither pattern

1. 入力画像を4x4のブロックに分割する.
2. ブロック内の各画素がディザパターンの対応画素*16+8以上なら,出力画素を255,そうでないなら,0とする.
3. 全てのブロックについて,2を行う.

ディザ法では周期的パターンが目立つので(実例を後述します),ディザパターンをFig.2に固定せず,可変にする方法も考案されているようです.

・誤差拡散法(error diffusion method)
これは,2値化を行うことによる誤差をキャンセルさせて行くというものです.
処理の流れは,以下の通り.

f:入力画素
g:出力画素

1. fからgを以下の様に決定し,誤差をe=g-fとする.
f>127 → g=255
f≦128 → g=0
2. 誤差eを入力画素周辺の数画素に分散させる.
分散式の例:
f=f(x, y)だったとき
f'(x+1, y)=f(x+1, y)+(5/16)e
f'(x+1, y)=f(x-1, y+1)+(3/16)e
f'(x+1, y)=f(x, y+1)+(5/16)e
f'(x+1, y)=f(x+1, y+1)+(3/16)e
3. 1,2の処理を,全画素について行う(左上から右下に向かって).

下が今回の例.


Fig.3 sample


Fig.4 density pattern method
出力画像がでかいので一部のみ.


Fig.5 dither method


Fig.6 error diffusion method

誤差拡散法が一番周期的パターンが目立ちにくいです.

これでまた一つ,人生の楽しみが増えました.

2009年6月15日月曜日

画像処理 #17 LOGフィルタ

またまた画像処理ネタ.

LOGフィルタ(Laplacian Of Gaussian Filter)

LOGフィルタというものがあります.
エッジの検出には,ラプラシアンフィルタを使ったりします.ラプラシアンフィルタは,2次微分と同様の働きをするため,値が+から-に変化する所(ゼロ交差=zero crossing)がエッジに相当します.しかし,2次微分であるためノイズが強調されます.だので,ガウシアンフィルタをかけ平滑化した後,ラプラシアンフィルタをしましょうというのがLOGフィルタです.

下がフィルタの式です.



ちなみにグラフはこんな感じ.


Fig.1 LOGフィルタのグラフ(σ=2)

下に例を…


Fig.2 元画像


Fig.3 LOGフィルタ(σ=1)


Fig.4 LOGフィルタ(σ=2)


Fig.5 LOGフィルタ(σ=4)


Fig.6 LOGフィルタ(σ=8)

左の画像は,フィルタ適用後の値が0の時,中間の色(=(128,128,128)T)となるようにしています.
右の画像は,ゼロ交差を白色にしたものです.

面白い感じにエッジが検出出来ています.
σを大きくすることで,エッジ検出が鈍くなっていきます.

いやぁ,フィルタって本当にいいもんですね~.