手習ひデジタル信号処理(171) Scilab、{IPCV}、超解像(多画像超解像)

Joseph Halfmoon

ScilabのIPCV「ツールボックス」に含まれる関数を練習中。今回は「超解像」。単なる画像のアップコンバージョン的なものから「ディープ」なAI使ったものまでいろいろある中で、IPCVが提供している関数は「マルチフレーム画像」からなんやかんやで「超解像」画像を作りだす関数みたいです。素人老人にはよう分からんぜよ。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上の    Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。

例によってGoogleの生成AI、Gemini様にお伺いしてみる

メンドイご説明はGemini様にお願い(押し付ける)ということで以下貼り付けさせていただきます。SuperResGemini

最近の「ディープ」なAI使った超解像のアルゴリズムでは、単一画像から超解像する場合にもケッコーイケてる高精細な画像を作り出せるみたいです。それに比べるとIPCVで実装されているアルゴリズムはひと時代かふた時代前の手法に見えます。ホントか?

ともあれ、用意されている関数 imsuperres に複数画像が含まれるリストを与えることで超解像と称する画像を生成できるみたい。

imsuperres()とimsuperres_params()

imsuperres()関数に画像リストを与えることで返り値に超解像画像が得られます。なお、それを制御するパラメータは構造体に格納されてます。デフォルト値は内蔵されているので、デフォルトのままでよければ設定不要。パラメータを与えたい場合は、imsuperres_params()という関数を呼んでやるとデフォルト・パラメータが格納された構造体が返ってくるので、これに値を代入した上で、imsuperres()の第2引数に構造体を与えてやれば反映されるようになっているみたい。

今回練習の例題

Helpファイルの処理例では、imsuperres_params()をまったく使っていなかったので、以下では、訳も分からずimsuperres_params()も使ってみた処理例としてみました。

S = list();
S(1) = imread(fullpath(getIPCVpath() + "/images/superres/input001.png"));
S(2) = imread(fullpath(getIPCVpath() + "/images/superres/input002.png"));
S(3) = imread(fullpath(getIPCVpath() + "/images/superres/input003.png"));
S(4) = imread(fullpath(getIPCVpath() + "/images/superres/input004.png"));
S(5) = imread(fullpath(getIPCVpath() + "/images/superres/input005.png"));
S(6) = imread(fullpath(getIPCVpath() + "/images/superres/input006.png"));
S(7) = imread(fullpath(getIPCVpath() + "/images/superres/input007.png"));
S(8) = imread(fullpath(getIPCVpath() + "/images/superres/input008.png"));
S(9) = imread(fullpath(getIPCVpath() + "/images/superres/input009.png"));
S(10) = imread(fullpath(getIPCVpath() + "/images/superres/input010.png"));
St  = imsuperres(S);
params = imsuperres_params()
params.rfactor = 8;
St8  = imsuperres(S, params);
subplot(231);imshow(S(1));title("Original Image 1 of 10");
subplot(232);imshow(S(2));title("Original Image 2 of 10");
subplot(233);imshow(S(3));title("Original Image 3 of 10");
subplot(234);imshow(S(4));title("Original Image 4 of 10");
subplot(235);imshow(St);title("Super Resolution, rfactor=4");
subplot(236);imshow(St8);title("Super Resolution, rfactor=8");
上記処理例

内部で設定されている構造体中のパラメータの初期値は以下のようでした。params

また、imsuperres関数に10枚の画像を食わせてますが、その画像の位置合わせでもしているのか、以下のような出力がでてまいります。imsuperres

アルゴリズムとしては「古典」なのか?知らんけど。

そして肝心の結果が以下に。左上から4枚の入力画像はお馴染みレナ様画像の粗くて、ノイズも載っているバージョンみたい。imsuperresDemoResult

下中央と右下の2枚が imsuperres関数の出力です。真ん中はデフォルトのrfactor=4、右下はrfactor=8としてみたもの。老眼の老人の目にはデフォルトの rfactor=4 の方が適している感じ。入力画像の粗さは消えて、ノイズも消えてるように見えます。一方、右下は細かくしようという努力の割にぼやけてる?ホントか?

手習ひデジタル信号処理(170) Scilab、{IPCV}、ユーティリティツールその3 へ戻る

手習ひデジタル信号処理(172) Scilab、{IPCV}、Deep Learning? へ進む