手習ひデジタル信号処理(142) Scilab、{IPCV}、空間的な変換

Joseph Halfmoon

前回はモルフォロジーでした。今回は、Spatial Transformations(空間的な変換、変形)に分類されている関数どもを練習してみます。画像の一部(サブリージョン)の抽出、リサイズ(拡大、縮小)、ローテイト(回転)そして「画像ピラミッド」の構築です。サンプル画像はすべてお猿様のご尊顔。お猿様祭りだ?

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

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

部分画像の抽出

部分画像(サブリージョン)の取り出しに使える関数は以下の2つです。

    • imcrop
    • imcropm

imcropの方は取り出すサブリージョンのドット位置を指定してデータを取得するもの。一方、imcropmは表示された画像の上でマウスで切り出し位置を指定して取り出すインタラクティブな方法です。

例によってお猿様のご尊顔をロードして、imcrop、imcropmしてみるシーケンスが以下に。

im = imread(fullpath(getIPCVpath() + "/images/baboon.png"));
subim = imcrop(im, [20, 30, 200, 300]);
imshow(subim);

J = imcropm(im);
imshow(J);

取り出した画像が以下です。subregion

リサイズ

画像を拡張したり、縮小するリサイズですが、拡大、縮小の倍率以外にどのような「補間」アルゴリズムを使用するか指定することが可能です。いくつか選択肢が用意されてますが、「お任せ」で処理してもらうことも可能。以下はデフォルト設定(おまかせ)でやってみたものです。なお、お任せのときは、nearest-neigbor法適用とのこと。

imr = imresize(im, 1.5);
size(im)
size(imr)

imshow(im, 1);
imshow(imr, 1);

画像が以下に。resize
念のため、実画像サイズが以下に。
resizeOPR

回転(ローテイト)

imrotateが回転に使う関数です。回転角は「度」であたえます。こんな感じ。

R = imrotate(im,45);

回転したお猿様のご尊顔が以下に。rotate45

画像ピラミッド

impyramid関数は、みんな大好き画像ピラミッドを「1段」積んでくれる関数です。reduceを指定すれば1段小さい(各辺半分)画像を、expand指定すれば1段大きい(各辺倍)画像を生成してくれます。使用されるのは5x5のガウシアンフィルタのようです。

im1 = impyramid(im, 'reduce');
im2 = impyramid(im1, 'reduce');
im3 = impyramid(im2, 'reduce');
subplot(141); imshow(im);
subplot(142); imshow(im1);
subplot(143); imshow(im2);
subplot(144); imshow(im3);

ピラミッドの画像(すべて同じサイズにプロットされている)が以下に。GaussianPyramidReduction

実際の各段の実サイズが以下に

PyramidSizeこれで空間的な変形は思いのまま、ホントか?

手習ひデジタル信号処理(141) Scilab、{IPCV}、モルフォロジー処理その2 へ戻る

手習ひデジタル信号処理(143) Scilab、{IPCV}、画像の算術演算 へ進む