2010年10月27日

Poisson Image Editingについて その2

昨日の続きです。

OpenGL+CUDA環境に移植してみました。CUDAで計算していないので意味ないですが。

基本的な計算の流れはOpenCVを使うと下記の様になります。

前処理
1. 合成元画像の読み込み
2.RGB各チャンネルのラプラシアンを計算

 // RGB各チャンネルはcvSplitで取得
 color[i] = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
 cvSplit(src, color[0], color[1], color[2], NULL);
 // ラプラシアンフィルタをかけた結果は-4*255〜4*255のsigned short型
 laplace[i] = cvCreateImage(cvGetSize(src), IPL_DEPTH_16S, 1);
 // 上下左右が1倍、中心が-4倍のラプラシアンフィルタを使用
 cvLaplace(color[i], laplace[i], 1);
 // 計算結果は符号も重要なので絶対値を取らずにそのまま保存
 laplaceData[i][j*src->width+k] = (double)((((short*)laplace[i]->imageData)[j*src->width+k]));

4.合成先画像の読み込み
5.合成先画像の結果を保存する配列を2つ準備

 double imgOld[3][height*width], imgData[3][height*width];

6.合成先画像の画素値をそのまま保存
 (境界条件(初期条件)を合成先画像の画素値に設定)

ループ処理(最低1000回程度?)
1.合成元の矩形を選択
2.合成先の矩形を選択
3.ラプラシアンから画素値を計算

 // 画素値データの保存
 imgOld[k][targetY*dest->width+targetX] = imgData[k][targetY*dest->width+targetX];
 // 4近傍の画素値データの合計を計算
 sum[k] = 0;
 sum[k] += imgOld[k][targetY*dest->width+(targetX-1)];
 sum[k] += imgOld[k][targetY*dest->width+(targetX+1)];
 sum[k] += imgOld[k][(targetY-1)*dest->width+targetX];
 sum[k] += imgOld[k][(targetY+1)*dest->width+targetX];
 // 画素値データを計算
 imgData[k][targetY*dest->width+targetX] = 0.25*(-laplaceData[k][inputY*dest->width+inputX]+sum[k]);

4.結果の格納
  imgData[0], imgData[1], imgData[2]を0〜255の範囲にしてIplImageのimageDataにコピー
  cvMerge(color[0], color[1], color[2], NULL, src);でRGB画像に戻す

実行結果

左の素材をマウスでドラッグして、右の画像に右クリックで貼り付けています。



ミクの画像は下記サイトのものを使わせていただいております。
http://idolls.cute.bz/archives/category/creative/icon

瞳の方は適当に画像検索したので問題があるかもしれません。

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

2010年10月26日

Poisson Image Editingについて

ポアソン分布について勉強していたら、なぜかPoisson Image Editingというものを試していました。

画像の合成をするときに、合成元の画像のラプラシアンを計算しておいて、合成先の画像の境界線の画素値を境界条件として、後はポアソン方程式をガウス=ザイデル法などを用いて解けばいいみたいです。

参考サイト:
http://rexpit.blog29.fc2.com/blog-entry-18.html
http://teamcoil.sp.u-tokai.ac.jp/classes/EM1/Poisson/index.html

実行結果

1.空+飛行機
sky_output.bmp

2.空+Girl画像
girl_output.bmp

合成先の情報は境界線の画素値しか使っていないので、色々改善できるんだと思いますが、やらないと思いますね。

空や飛行機はフリーのテクスチャ画像を使用させていただいております。
web拍手 by FC2
posted by シンドラー at 21:13 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2010年10月24日

ノイズ入りの画像について

画像処理の目的のひとつに、ノイズの除去があります。
そういうわけで、ノイズ入り画像を作ってみることにしました。

1.ガウスノイズ

正規分布に従うノイズ。
正規乱数を使ってノイズを計算して、原画像に加算します。

参考サイト:http://www.inf.ie.kanagawa-u.ac.jp/c_learn/class/norminv.html

2.ポアソンノイズ

参考サイト:
http://www.ceremade.dauphine.fr/~peyre/numerical-tour/tours/denoisingwav_5_data_dependent/
http://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A2%E3%82%BD%E3%83%B3%E5%88%86%E5%B8%83

ポアソン分布に従うノイズ。
参考サイトでは画像データを読み込んでλmin-λmaxの間に量子化して、そのλを使ってノイズを計算しているようです。

そのため、暗い部分=λが小さい=ノイズも小さい、明るい部分=λが大きい=ノイズがのりやすいという傾向があるみたいです。一般的な話なのかどうかは知りません。

実行結果

1.原画像(左)、ガウスノイズ(中)、ポアソンノイズ(右)

Lenna.bmpLenna_gauss.bmpLenna_poisson.bmp

2.原画像(左)、ポアソンノイズ(右)

poissoninput3.bmpnoise_10_15.bmp

こういうノイズは輝度差が小さい部分はエッジ検出等難しそうですね。
web拍手 by FC2
posted by シンドラー at 18:55 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2010年10月14日

ウェーブレット変換のテスト

パターン認識などで周波数解析も必要かと思い、とりあえずウェーブレット変換をテストしてみました。

実行結果

cuda_pbo_cpu_002.JPG

CPUでやっていますが、毎回画像読み込みなど無駄な処理を含んでいても50FPSぐらいでていますね。
1次元ウェーブレット変換の部分をCUDAで並列処理すれば速くなったりするんですかね。

今のところ分解しただけなのでもう少し何か面白そうなことを試してみたいです。
web拍手 by FC2
posted by シンドラー at 01:13 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2010年10月12日

OpenGL+CUDAで画像処理

OpenGL+CUDAでVBO使って頂点アニメーションはやっていたのですが、OpenGL+CUDAで画像処理をやっていなかったので、それをやってみました。

OpenGL+CUDAを使用する場合にはPixel Buffer Object(PBO)を使うのが一般的?なようでしたので、それで試してみました。

参考サイト
http://wiki.livedoor.jp/mikk_ni3_92/d/PixelBufferObject
http://d.hatena.ne.jp/mokehehe/20090915/

PBOを2枚作成して、両方CUDAに渡して1枚を入力、もう1枚を出力として画像処理をしています。入力画像にはテクスチャメモリを使った方がいいと思いますが、とりあえず両方PBO使っています。

ついでに2枚を横に並べて表示などを行っていますので色々無駄が多そうです。

実行結果

とりあえず3x3のX方向のSobelフィルタをかけてみました。

cuda_pbo_cpu_001.JPG

実行速度

(256x256画像)
CPU: 51 FPS
GPU: 49 FPS

(1024x768画像)
CPU: 10 FPS
GPU: 15 FPS

小さい画像だとCPUの方が早い結果に・・・普通の大きさの画像でも大して変わらないしもう少しうまく使わないといい結果は出ないみたいですね。

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

2010年10月04日

OpenCV2.1に関するメモ

OpenCV2.1に関するメモです。
(2.1で追加されたものもいくつかあります)

色々ありすぎて何を使えばいいのか知識が足りないので良くわかりませんね。
適当に列挙したので抜けとか間違いとかあると思います。

・特徴点
-コーナー検出
--cvGoodFeaturesToTrack, cvFindCornerSubPix
--http://opencv.jp/sample/gradient_edge_corner.html#goodfeatures
-SIFT特徴量
--http://d.hatena.ne.jp/aidiary/20091024/1256384360
-SURF特徴量
--http://d.hatena.ne.jp/aidiary/20091030/1256905218
-HOG特徴量
--http://d.hatena.ne.jp/poor_code/20091111/1257944372
-Fern特徴量
--http://d.hatena.ne.jp/gomi-box/20100523/1274614584
-Haar-like特徴
--cvHaarDetectObjects
--http://opencv.jp/sample/object_detection.html

・領域分割/減色
-K-means法によるクラスタリング
--cvKMeans2
--http://opencv.jp/sample/misc.html#clustering
-画像ピラミッドを用いた領域分割
--cvPyrSegmentation
--http://opencv.jp/sample/segmentation_and_connection.html#pyrsegm
-平均値シフト法による画像のセグメンテーション
--cvPyrMeanShiftFiltering
--http://opencv.jp/sample/segmentation_and_connection.html#meanshiftsegm
-Watershed法による画像の領域分割
--cvWatershed
--http://opencv.jp/sample/segmentation_and_connection.html#watershed
-GrabCut画像セグメンテーションアルゴリズム
--opencv/samples/c/grabcut.cpp

・物体検出/追跡
-バックプロジェクションパッチによるテンプレート探索
--cvCalcBackProjectPatch
--http://opencv.jp/sample/histogram.html#backprojectionpatch
-テンプレートマッチング
--cvMatchTemplate
--http://opencv.jp/sample/matching.html#template
-形状マッチング
--cvMatchShapes
--http://opencv.jp/sample/matching.html#shape
-動的背景更新による物体検出
--opencv/samples/c/bgfg_segm.cpp
--http://opencv.jp/sample/accumulation_of_background.html#background_sub
-オプティカルフロー1(勾配法)
--cvCalcOpticalFlowHS, cvCalcOpticalFlowLK
--http://opencv.jp/sample/optical_flow.html#optflowHSLK
-オプティカルフロー2(ブロックマッチング)
--cvCalcOpticalFlowBM
--http://opencv.jp/sample/optical_flow.html#optflowBM
-オプティカルフロー3(疎な特徴に対するオプティカルフロー)
--cvCalcOpticalFlowPyrLK
--http://opencv.jp/sample/optical_flow.html#optflowPyr
-パーティクルフィルタ
--Condensation
--http://opencv.jp/sample/estimators.html#condensation
-SVMによる物体検出
--CvSVM
--http://opencv.jp/sample/svm.html#svm_predict
-カルマンフィルタ
--CvKalman
--opencv/samples/c/kalman.c
--http://opencv.jp/opencv-1.0.0/document/opencvref_cv_estimators.html#cv_motion_estimators

・ステレオマッチング
-ブロックマッチングによるステレオマッチング
--cvFindStereoCorrespondenceBM
-グラフカットによるステレオマッチング
--cvFindStereoCorrespondenceGC
-SGBM(semi-global block matching)によるステレオマッチング
--opencv/samples/c/stereo_match.cpp

とりあえず興味を持ったものをいくつか試してみようかな的なメモです。
web拍手 by FC2
posted by シンドラー at 14:48 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2010年10月02日

ステレオマッチングのテスト

下記サイトを参考に、速度等は考えずにとりあえず面積相関でステレオマッチングを試してみました。

http://www.image.esys.tsukuba.ac.jp/range_finder/stereo/index.html

実行結果

画像は参考サイトのものおよび筑波のテスト画像を使用させていただいております。

フィルタのサイズ:11x11

左上:原画像(左)
右上:原画像(右)
左下:自分で実装した結果
右下:OpenCVのcvFindStereoCorrespondenceBM

OpenCVの関数はカメラ間の距離(基線長)がある一定以上長くなるとうまく動かなくなる気がします。
パラメータをちゃんと設定すれば解決できる気もしますが。

テスト画像で基線長が一番長いもの

bm_test_003.JPG

テスト画像で基線長が一番短いもの
探索範囲制限なし(左)とあり(右)

bm_test_004.JPGbm_test_005.JPG

参考サイトの画像
bm_test_002.JPG

自分で実装したものはFPSが0.2とかひどいことになっていますがcvIntegralなどを使えばもう少しは早くなるはずです。

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