前回は、ScilabのIPCVに含まれる動画像ハンドリングツールを手習ひ。ScilabのIPCVにはそれ以外にも各種ユーティリティツールが含まれてます。今回は静止画処理の御供的なツールのいくつかを使ってみます。既にお世話になっているものを復習したのですが、既に見えた問題にも再び直面。まあ、問題点の確認ということで。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。
Utilities and Interactive Tools
このカテゴリの中には、動画、静止画、カメラに関するものなど各種処理のときに必要そうなツールがふくまれてます。画像をみながらインタラクティブに処理できるものも含まれてます。
ただしHELPファイルの通りに使える、と思っちゃいけないのではないか、と素人老人の感想です。コマケー問題があるのよ。まあ、知っていて使う分には役に立つんじゃないかと思いまっけど。
imrectsとrectangle
この2関数はどちらも静止画の上に矩形を描く関数です。その違いはという感じです。
-
- imrectsは、静止画を表示しておいて、それに重ねる形で矩形を描く
- rectangleは、静止画と矩形の座標、色を入力として静止画の上に矩形を描いた新たな画像を出力する
1画面では、どちらも思ったとおりの処理ができるのですが、複数画面を連続処理したときに、imrectsの方は、前々回の処理例で問題になった「問題」が発生します。
まずは2つを比較するための処理例コードが以下に。
Aorg = imread(fullpath(getIPCVpath() + "/images/coins.png")); rec1 = [20 20 50 50]; rec2 = [50 50 100 100]; Arec1 = rectangle(Aorg, rec1, [255 0 0]); Arec2 = rectangle(Aorg, rec2, [255 0 0]); scf(1); subplot(221); title('imrect 1'); imshow(Aorg);imrects(rec1',[0 255 0]); subplot(222); title('imrect 2'); imshow(Aorg);imrects(rec2',[0 255 0]); subplot(223); title('rectangle 1'); imshow(Arec1); subplot(224); title('rectangle 2'); imshow(Arec2);
下段のrectangle関数での処理では異なる矩形2つを描きわけるのに何の問題もありません。しかし、上段のimrect関数の場合、「同じ画像」に対して、2つめの矩形を描こうとすると「下地の画像」が潰れていく現象が発生します。これは前々回でみたとおり、3つめ、4つめと縦方向の潰れかたが激しくなるような。。。前々回でおこなったように、rectangle関数を使えば回避できないこともないので、見て見ぬ振りっと。いいのか、そんなことで。
imroiとimselect
imroiは、ROI(Region Of Interest)を指定するためのマスク・データを生成するための関数です。第165回でROI領域だけにフィルタをかけるために使いました。ターゲット画像を表示しておいて、インタラクティブに点を指定していって、その点で囲まれる多角形領域をROIとしてとりだせます。ただし、点数を指定しないとデフォルトでは10点指定するまでインタラクティブ・モードから戻ってきませぬ。点数を明示的に指定しないとウザイっす。
一方、imselectの方はターゲット画像を表示しておいて、インタラクティブに点を指定すると、点の座標のリストを返してくれます。これを使ってマスクを作っても良いし、何か別の処理にも使えそう。そのうえHELPファイルみると、点数の上限に達しなくても右クリックでインタラクティブ・モードから戻りそう?しかしやってみると、結局指定点数まで戻ってきませぬ。素人老人の使い方、どこか悪いの?
処理例コードが以下に。
S = imread(fullpath(getIPCVpath() + "/images/puffin.png")); title('imselect'); imshow(S); pts = imselect(5); title('imroi'); imout = imroi(S, 5); title('imroi output'); imshow(imout);
まずは、imselectによる点の座標の取得の図。以下は5点取得せよの4点目までの図。
つづいてimroi関数。こちらの関数は「小さめの画像」を表示してくれて、その上で点を指定するよう求められます。以下図はテキトーに拡大してますが、元画像はかなりチイセーです。
こちらはROI領域を取り出すための以下のようなマスクデータが得られます。
まあ、コマケーこと気にしなければ使える?