2013年07月26日

法線マップからの高さマップの計算 その2

前回の続きです。

normalToHeight2_003.png

normalToHeight2_002.png
↑の492x492の法線マップ(GIMPを用いて3x3のSobelフィルタを適用)から64x64の領域を切り出して高さマップを計算した結果,次のような結果が得られました.

実行結果の拡大図
normalToHeight2_005.png

拡大してみると,市松模様のようなノイズがのってしまっていました.
原因としては,λIを足したうえで疑似逆行列で計算しているため,その辺りで誤差が発生した可能性が考えられます.

それぞれを計算してそのまま繋げた結果
normalToHeight2_006.png

市松模様のノイズに関しては,仕方がないので平滑化フィルタで取り除くことにしました.
もう一つの問題点として,タイル毎に明るさ(高さ)がバラバラになってしまっていることがあります。
normalToHeight2_004.png

境界線の平均輝度値が一致するように補正した画像
normalToHeight2_007.png

境界線が少し目立ちましたので、平滑化+コントラスト伸長を適用して最終的な結果としました.

平滑化→コントラスト伸長した結果
normalToHeight2_008.png
原画像
normalToHeight2_001.png

3x3のSobelを掛けたことが分かっているので元に戻せるのは当然といえば当然なうえ、平滑化の影響で多少ぼけてしまっていますが、ある程度は高さマップに復元ができているのではないかと思います。

web拍手 by FC2
posted by シンドラー at 01:00 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2013年07月24日

最小二乗法による関数の多項式近似

最近たまに使用している疑似逆行列についてのメモです。

最小二乗法のちゃんとした説明(二乗誤差を最小化するために係数の偏微分を計算して…)というのはWikipedia[1]などにお任せして、とりあえず疑似逆行列を使って未知数<方程式となる連立一次方程式を解くということをします。

lsm_001.png

[1]を見ると、疑似逆行列は効率が悪いので余り使われないって書かれてますね…。

実行結果

sin関数+ノイズで生成した赤点から、5次の多項式近似を行った結果(青線)です。
lsm_002.png
5+1=6個の未知数に対して、512個のサンプル点を使用しています。
n≫m+1なので、正則っぽいです。
5次の係数が0だったので実質4次になってます。

[1] 最小二乗法
web拍手 by FC2
posted by シンドラー at 00:05 | Comment(0) | TrackBack(0) | Pattern Recognition | このブログの読者になる | 更新情報をチェックする

2013年07月18日

法線マップからの高さマップの計算

高さマップから法線マップは[1]に紹介されているような方法で計算できますが、逆に法線マップから高さマップを計算する方法はあるのかどうかについて調べてみました。
GIMPのプラグインなど、いくつかのソフトウェアで計算できるようですね。
その他アルゴリズムを探したところ、[2]のPDF資料が見つかりましたので、自分なりに試してみました。
以下、自分なりの解釈なので間違っているかもしれません。

normalToHeight_001.png

normalToHeight_002.png

normalToHeight_003.png

実行結果
適当に作った原画像の高さマップ(64x64)
normalToHeight_004.bmp

原画像から生成した法線マップ(64x64)
normalToHeight_005.bmp

法線マップから計算した高さマップ(64x64)
normalToHeight_006.png

多少の誤差はありますが、それなりに復元できていると思います。

[1] t-pot『動的法線マップ』
[2] normal map to height map
web拍手 by FC2
posted by シンドラー at 02:36 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2013年07月11日

Sobelエッジ検出フィルタの係数導出方法について

SobelとかPrewittのエッジ検出フィルタの係数ってどうやって出てきたのか良くわかっていなかったんですが、[1]に詳しく書かれていました。
後、畳込みで計算する方法[2]もあるようです。

今回は畳込みで計算する方法を試してみました。
参考サイトでは、Matlabのconv2という関数[3]を使っているようです。
3x3と3x3の畳込みが5x5になるのが良くわからなかったのですが、重なる部分があるので3+3-1=5になるんですね。

sobel_001.png

一応横方向のSobel7x7を計算した結果が以下のようになりました。

sobel_002.png

[1] http://www.iasj.net/iasj?func=fulltext&aId=52927
[2] http://stackoverflow.com/questions/9567882/sobel-filter-kernel-of-large-size
[3] http://www.mathworks.co.jp/jp/help/matlab/ref/conv2.html
web拍手 by FC2
posted by シンドラー at 02:18 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2013年07月10日

シームレステクスチャの作成 その2

メタセコのVer3.1からバンプマッピングが実装されているそうなので試してみました[1]。

(1) 色情報から高さ情報を計算
単純にグレースケール化した場合、白と黄色ではあまり差が出なかったので、青色の値でグレースケール化してみました。繋ぎ合わせた境界がはっきり見えてしまっていますね…。

seamless_004.bmp

メタセコで使用する場合の注意点ですが、256色のBMPファイルにする必要があります。ペイントで256色に落としたら、既定のパレットを使っているのか色がおかしくなりましたので、自分で出力することにしました。

(2) 環境遮蔽の計算
高さ情報とそこから計算した法線ベクトルを使って、SSAOのような計算をしてみました。

seamless_005.png

テクスチャ画像に掛け合わせた結果が下のようになります。低周波成分をカットした影響でのっぺりしていたのを、環境遮蔽で多少くっきりさせる感じでしょうか。

seamless_006.png

(3) メタセコへの適応
とりあえず基本形状の球を作成して、材質のところに模様や凸凹がありますので、作成した画像を張り付けます。UVは設定の仕方が良くわからないのでそのまま貼ってしまいます。
反射光の設定なども適当に変更します。

seamless_007.png

実行結果



アスペクト比がおかしくなっていますが気にしない方針で。
バンプマッピングは光源を動かしたときの凸凹感がいいですね。

おまけ

あまり凹凸感が出なかった…。

seamless_008.png

[1] blog.metaseq.net/2012/05/ver31-beta11.html
web拍手 by FC2
posted by シンドラー at 01:36 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2013年07月03日

シームレステクスチャの作成

シームレステクスチャを使いたくなったので、ネットにあるものを使えばいいのですが自分で作る方法について調べてみました[1][2]。
参考サイトは画像処理ソフトを使ってやっていますが、プログラムで書く場合についてです。

まずは対象となる画像を用意します。なるべく画像内に特徴的な物体がなくて、つなぎ目も目立ちにくい画像が良いかと思います。
今回は適当にフリーのテクスチャを検索して、[3]のメロン画像を使用させていただくことにしました。

1.写真からシームレステクスチャに使いやすそうな場所を切り出す

シームレステクスチャの作成方法で検索すると、大体が画像の半分だけシフトした画像をつくって、つなぎ目を消す、という方法をとっていました。
つなぎ目はスタンプとかブラシ等で消していましたが、元々つなぎ目が目立ちにくい場所を探すと楽になるのではないかと思い、指定したサイズ(例:256x256)の切り出し矩形で、上端の色と下端の色の誤差及び左端の色と右端の色の誤差が最も小さい場所を力技で計算して切り出してみました。

切出し結果

seamless_001.png

縦横2枚ずつ並べたタイル画像

seamless_002.png

これでもそんなに境界線は目立たない気がしますね。

2.シフト画像を作成

画像の半分のサイズ分右下にシフトした画像を作成します。
X'=(X+width/2)%width
Y'=(Y+height/2)%height
で計算できます。

3.フーリエ変換して低周波成分をカット→逆フーリエ変換で元に戻す

[2]のサイトで、周期的な模様が目立つ場合は低周波成分をカットするとよい、ということでしたので、上位5個までカットしました。
上記サイトでは、平均値となる0成分もカットして、カラーバランス調整で元に戻していましたが、0成分だけは残して逆フーリエ変換しました。

4.境界部分にガウスフィルタを掛ける

気休め程度ですが、境界となる部分周辺だけガウスフィルタを掛けました。

縦横2枚ずつ並べた実行結果

seamless_003.png

境界線がもっと目立たないような画像ならもう少しうまくできるかと思いますがとりあえずこんな感じで。

参考サイト
[1] http://kuretex.at.webry.info/200812/article_1.html
[2] http://blogs.msdn.com/b/ito/archive/2008/03/21/photo-to-texture.aspx
[3] http://witchfinder-stock.deviantart.com/art/Fruit-128246066

web拍手 by FC2
posted by シンドラー at 21:52 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする