前回はモルフォロジーでした。今回は、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);
リサイズ
画像を拡張したり、縮小するリサイズですが、拡大、縮小の倍率以外にどのような「補間」アルゴリズムを使用するか指定することが可能です。いくつか選択肢が用意されてますが、「お任せ」で処理してもらうことも可能。以下はデフォルト設定(おまかせ)でやってみたものです。なお、お任せのときは、nearest-neigbor法適用とのこと。
imr = imresize(im, 1.5); size(im) size(imr) imshow(im, 1); imshow(imr, 1);
回転(ローテイト)
imrotateが回転に使う関数です。回転角は「度」であたえます。こんな感じ。
R = imrotate(im,45);
画像ピラミッド
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);
ピラミッドの画像(すべて同じサイズにプロットされている)が以下に。
実際の各段の実サイズが以下に