前回はFFTかけて周波数ドメインでフィルタしてから元画像に戻す操作を練習。しかしその適用は全画面に一律でした。今回は画像の一部領域(ROI、Region of Interest)のみにフィルタをかける関数を練習してみます。まあフィルタかけてもお惚け老人は、よくよく見て気づく程度なんだけれども。老眼はツライよ。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。
ROI、Regin of Interest
ROI、日本語でも普通ROIというけど、敢えて訳せば「注目する領域」じゃね。以前も練習した各種アルゴリズムなどで取り出した領域をROIとして設定するのがフツーだけれど(なんのフツーだ?)、今回はテキトーなROIに対してフィルタを行おうというので、ROIの指定は手動っす。以下のインタラクティブな関数を使います。
ROI領域のマスク = imroi(入力画像)
入力画像が表示されるので、その上でマウスをクリクリしていくことでROI領域(多角形)を定義し、多角形の内側領域を処理できるようなマスクを生成してくれるようです。ただし、何も指定しないと、デフォルトで10点の位置をマウス指定することになります。「ちょいと動作みるだけ」の今回は10点も指定するのが怠いです。そこで以下のように点数を指定してます。手抜き。
mask = imroi(S, 4);
以下はマウスで点を指定している途中の様子です。3点目までね。4点目をクリックすると、OKということで以下の画像は消えます。
上記のように左下の風船に写り込んだなにやら光のいくつかをROIにしようとしている雰囲気っす。
ROIに対するフィルタリングの実験コード
さて例によって、HELPファイルに提示されていた処理例サンプルをちょいと改造した実験コードが以下です。
S = imread(fullpath(getIPCVpath() + "/images/balloons_gray.png.")); mask = imroi(S, 4); h = fspecial('unsharp'); S2 = imroifilt(S,h,mask); scf(0); clf; subplot(131); title('original'); imshow(S); subplot(132); title('mask'); imshow(mask); subplot(133); title('imroifilt'); imshow(S2);
インタラクティブな imroi 関数でマスク指定をした後は、fspecial関数で unsharpマスクを生成し、それを本命の imroifilt関数で元画像に適用してます。unsharpフィルタは、なんだかシャープじゃない感じのお名前ですが、「コントラストを強調」してくれるフィルタらしいです。よく使うやつ?
左端がオリジナル、真ん中の白く抜けた部分が手動設定したROI、そして右端がunsharpフィルタをROIに適用した結果です。遠くからみるとサッパリなんだけれども画像を拡大してよくよく見たら、確かに右のROI領域は光にメリハリ?がある感じ。知らんけど。