
前回,openCVの超解像処理を質問させてもらったものです.
今,
http://opencv.jp/opencv2-x-samples/usage_of_spar …
の超解像処理をそのまま実行しています.
前回の質問(http://oshiete.goo.ne.jp/qa/6341130.html)で,1枚の画像を劣化させて複数の画像を作りだして,超解像処理をしていることはわかり,実行できるようになりました.
しかし,実際に行いたいのは,自分が持っている複数の画像を使って超解像処理を実行してみたいのですが,その場合プログラムのどの部分をどのように変えたらいいのでしょうか?
ヒントだけでもいいので,ご面倒かもしれませんが,ご教授お願いします.
No.2ベストアンサー
- 回答日時:
この関数
createDegradedImageandSparseMat32F(Mat& src, Mat& dest, Point2d move, int amp)
の引数ampが画像解像度の倍率を表しています.ampを入力する画像に合わせて倍率を変えてみてください.
ただし,実画像の画像ずれはshiftだけで表現することはかなり難しいです.実際の画像の場合は少なくとも平面の場合,アフィン変換,射影変換でずれを表現しなければ使えないかもしれません.その時は,
createDownsampledMotionandBlurCCDSparseMat32f内の疎行列の定義している部分(287~30行目)を変えてみてください.
No.1
- 回答日時:
このコードの作成者です.
超解像は,
1.位置合わせ
2.ブラーカーネル(ぼけ関数)の推定
3.例外除去(お好みで)
4.超解像(このデモで行っている処理)
をする必要があり,このデモでは位置合わせが既知,ブラーカーネルも既知(一定)でイレギュラー値は存在しないと仮定して問題を解いています.
実際のアプリケーションのように使うには,まず位置合わせの後,ぼけ関数推定をしたのち,イレギュラーにならない部分を推定するという作業が必要になります.
もしこのソースをもとにするなら,
位置合わせ結果とボケ関数推定結果を入力する部分を(イレギュラーっぽいものは0でマスクするなど例外処理もできるとなお良い)
createDownsampledMotionandBlurCCDSparseMat32f
に追加追加し,スパース行列を正しく入力してあげることが出来れば他はあまり変更せずに動作すると思います.
参考URL:http://opencv.jp/opencv2-x-samples/usage_of_spar …
この回答への補足
早速の解答ありがとうございます.
解答者様のおかげで多少つかめてきました.
そこで,60~72行目を以下のように変更してみました.
入力画像を2倍に高解像度化しようとしています(つまり,rfactor = 2 としている).画像の位置ズレ量は別のプログラムで推定したという前提で,ブラーカーネルもいじってません.
//(1) generate degraded images and degrading matrices for super resolution
for(int i=0;i<image_count;i++)
{
cout<<i<<endl;
// shift[i]には,別プログラムで求めたサブピクセルレベルの位置ズレ量
// が入る
move[i].x = shift[i].x;
move[i].y = shift[i].y;
if(i==0)// fix first image
{
move[i].x=0;
move[i].y=0;
}
Mat imtemp(image.rows,image.cols,CV_8UC3);
char file[30]
sprintf( file, "img%d", i);
degimage[i] = imread(file);
このようにすると,326行目の
dvec.reshape(3,dest.rows).convertTo(dest,CV_8UC3);
でエラーが発生してしまいます.
おそらく,imtempの行列サイズを変更したからだと思うのですが,解像度を向上させる場合はこのように変更しなければいけないのではないのですか?
とりあえず,
・入力画像を2倍に高解像度化したい
・位置ズレ量は既知
・ブラーカーネルもデフォルトのまま
これらの条件で実行したいと考えているので,お知恵をお借りしたいです.
長文失礼しました.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
UMLでの例外処理
-
switch の範囲指定
-
【Excel】特定の文字を含むセル...
-
VBAでループ内で使う変数名を可...
-
VBAでCOPYを繰り返すと、処理が...
-
EXCEL VBA マクロ 実行する度に...
-
ボタンクリックイベント 重複...
-
月度は何て読みますか?
-
メルカリのメルカードで買い物...
-
VB.NET Excelを読み込んでDataT...
-
リョウ・・・量?料?
-
EXCEL2003 VBAで2つのDBに接続...
-
Do~Loopした回数をカウントしたい
-
DoEventsがやはり分からない
-
findは動くがfindnextがマクロ...
-
VB6 DoEventsの代わりは?
-
Loadイベント中にほかのイベン...
-
インタラクティブの反対語は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
【Excel】特定の文字を含むセル...
-
switch の範囲指定
-
VBAでループ内で使う変数名を可...
-
EXCEL VBA マクロ 実行する度に...
-
UMLでの例外処理
-
銀行の窓口処理の件で知ってる...
-
VBAでCOPYを繰り返すと、処理が...
-
月度は何て読みますか?
-
インタラクティブの反対語は?
-
VB.NET DataGridViewでIsNewRo...
-
DoEventsがやはり分からない
-
VBの質問#if 0 then ってどう...
-
お家デートをしててハグを長い...
-
セックスレスの既婚女性は自慰...
-
VB.NET Excelを読み込んでDataT...
-
リョウ・・・量?料?
-
メルカリのメルカードで買い物...
-
Loadイベント中にほかのイベン...
おすすめ情報