2009年8月26日水曜日

数学 #8 初等関数

初等関数とは何でしょうか.

初等関数とは,
「複素数を変数とする多項式関数,指数関数,対数関数の四則演算,合成によって表示できる関数」

です.
例えば,
x5+ln(sin(x-1))+ecos(x4)+ln29(xln(x))

とかです.

arcsin(x)は初等関数です.何故なら,
arcsin(x)=-iln(ix+√(1-x2))

だからです.

しかし,
(1-x4)-1/2
の不定積分は初等関数では表せません.

初等関数で表せないものは,一部の特殊関数で表すようです.

特殊関数は色々あります.生涯を特殊関数に捧げるも良いかも知れません.

2009年8月22日土曜日

数学 #7 数値解析 #2 積分の近似計算

今回は,積分の近似計算について.

フレネル積分

フレネル積分は以下のように定義されています.





残念なことに,この積分は初等関数で表すことは出来ないようです.
というわけで近似計算.





↑では,
1.三角関数をマクローリン展開
2.項毎に積分
を行い,無限級数の形で解を出しています.

では,この級数のグラフを示しましょう.


Fig.1 Fresnel(cos)


Fig.2 Fresnel(sin)

第n項までの和のグラフを表示しています(nは1から40近くまで取ってあります).
この級数展開の問題は,tを大きくすると,より多くの項を計算に入れないといけないという点にあります.
実際,nを大きく取っても,tの値を大きくすると直ぐに発散してしまいます.


Fig.3 Fresnel

x(t)とy(t)をxy平面にプロットすると,上のような螺旋模様が描かれます.


Fig.4

発散した時の図,アヴァンギャルドな感じが楽しめます..

先に述べた問題が発生しない,他の近似計算法も沢山あるのですが,それは次回以降…

数学 #6 数列

問題:
次の□に入る数は何でしょう.
0, 2, 4, □, 8, …





正解:
答えは,“5”「とします」.とっても分かりやすい回答ですね.
不満がある,そんな方は下をどうぞ.





導出:
f(x)=(x4-7x3+14x2+4x)/6
という関数を用意して,
an=f(n)
とおけば,

a0=0,a1=2,a2=4,a3=5,a4=8

となります.
本当の所,上の問題であれば,どんな数でも答えとなりえます.
f(0)=0,f(1)=2,f(2)=4,f(3)=r,f(4)=8
となる関数f(x)は必ず存在します.

「子供の数だけ答えがある」というか,子供の数より答えは多いです.探そうとしていないだけの事です.

結論:
問題を作る方も,解く方も注意しましょう.

2009年8月19日水曜日

専門書を読む #14

集合・位相入門
~p69

ちまちまと.

2009年8月17日月曜日

専門書を読む #13

集合・位相入門
~p65

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

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

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

専門書を読む #12

集合・位相入門
~p62

能動的なノードの濃度.

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月14日金曜日

専門書を読む #11

集合・位相入門
~p60

やっと集合の濃度に入ります.

専門書を読む #10

集合・位相入門

~p55

2009年8月12日水曜日

知的遊戯

久しぶりにマトモなものを制作したので紹介.

「知的遊戯」
要はよくあるパズルゲームです.持っていた(実際に素手で遊ぶ)物を移植しました.
今回のコンセプトは「中国のパチモノっぽいゲーム」.


Fig.1

こんな感じ.


Fig.2

クリアすると上の画面になります.ちなみに「恭喜恭喜!」は,おめでとうの意.「初期化」クリックでまた出来ます.

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年8月2日日曜日

物理 #2 衝突(2次元)

今回は,2次元の衝突です.

球A:
位置:r1=(x1, y1)T
衝突前速度:v1=(v1x, v1y)T
衝突後速度:v1'=(v1x', v1y')T
質量:m1
反発係数:e1

球B:
位置:r2=(x2, y2)T
衝突前速度:v2=(v2x, v2y)T
衝突後速度:v2'=(v2x', v2y')T
質量:m2
反発係数:e2

表記の都合上,半径:rは省略します.
また,
v=(vx, vy)T=vxe1+vye2
とします.
e1, e2はそれぞれ,正規直交基底で,
e1=(1, 0)T, e2=(0, 1)T
です.

さて,この2つの球が衝突したとしましょう.どうなるでしょうか?
1次元の場合は,簡単に考える事が出来ましたが,2次元となると一筋縄ではいきません.
以下をご覧あれ.


Fig.1 Collision

衝突した瞬間の図です.ここで,
r=r2-r1
というベクトルをとったとしましょう.そして,rに垂直(=球2つの接線)なベクトルをとります.
この2つのベクトルを正規化したものをそれぞれ,
e1'=(e1x', e1y')T
e2'=(e2x', e2y')T
と表すことにします.
この時,e1', e2'は正規直交基底となります.
この基底上で考えると,e1'では,1次元空間の単純な衝突,e2'上では,速度の変動は全く無い,という事が出来ます.

というわけで,v1, v2を先の基底で表してみましょう.

v1=w1xe1'+w1ye2'
v2=w2xe1'+w2ye2'
とします.このときwは,以下の様に計算します.

w1x=v1e1'
w1y=v1e2'
w2x=v2e1'
w2y=v2e2'

wに関して衝突後の値をw'で表します.この時,
w1y', w2y'
は,衝突前に等しいので(前述),
w1x', w2x'
を求めればよいのです.

とはいえ,これは,1次元ヴァージョンの帰結に相違無いので,

w1x'=(m1w1x+m2w2x)/(m1+m2)+e(w2x-w1x)m2/(m1+m2)
w1y'=w1y
w2x'=(m1w1x+m2w2x)/(m1+m2)+e(w1x-w2x)m1/(m1+m2)
w2y'=w2y

となります.
あとは,元の基底で表すだけです.そのためには,
v1'=w1x'e1'+w1y'e2'
に,そのまま代入すればよいので,
v1x'=w1x'e1x'+w1y'e2x'
v1y'=w1x'e1y'+w1y'e2y'
v2x'=w2x'e1x'+w2y'e2x'
v2y'=w2x'e1y'+w2y'e2y'

というわけで,求める事が出来ました.

実際にシミュレーションしてみると,当たり前の動きをするのですが,感動を覚えます.