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

Joseph Halfmoon

前回は画像の空間的な変換でした。今回は画像の算術演算(Image Arithmetic)の回です。ぶっちゃけ、加減乗除に、差分絶対値、反転、線形結合などアリガチな演算を画像に対して施すもの。まあ、お惚け老人でも結果はほぼほぼ想像がつく関数どもデス。例によってサンプル画像はお猿様のご尊顔。今回もお猿様祭りは続くとな。

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

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

Image Arithmetic

今回練習する関数は以下です。

    • imadd
    • imsubtract
    • immultiply
    • imdivide
    • imabsdiff
    • imcomplement
    • imlincomb

最初の4つの関数は、2枚の画像の加減乗除の計算を行うものです。当然2つの画像のサイズや深さ方向の面数、数値形式などは同じでなければなりませぬ。また、例えば8ビット符号無の整数形式要素の引き算をして負の数になったりするとゼロにサチルるようです。

一方、imabsdiffは画像間の引き算を行うのはimsubtractと同じですが、引き算後絶対値をとってくれるので、負の数は正の数に「折り返され」ます。

画像を色方向に「反転」するimcomplement、多数の画像の線形結合を計算してくれるimlincombもあります。

加減乗除

まずは加減乗除です。処理例が以下に。imBがお猿様のご尊顔。imPは日本的には「ピーマンの類」の画像です。

imB = imread(fullpath(getIPCVpath() + "/images/baboon.png"));
imP = imread(fullpath(getIPCVpath() + "/images/peppers.png"));

imAdd = imadd(imB, imP);
imSub = imsubtract(imB, imP);
imMul = immultiply(imB, imP);
imDiv = imdivide(imB, imP);
subplot(161); title('B'); imshow(imB);
subplot(162); title('P'); imshow(imP);
subplot(163); title('B + P'); imshow(imAdd);
subplot(164); title('B - P'); imshow(imSub);
subplot(165); title('B * P'); imshow(imMul);
subplot(166); title('B / P'); imshow(imDiv);

上記を処理した結果が以下に。ImageArith_samples

お猿さまと、ピーマン(唐辛子?)の混ざり具合が微妙かと。

imabsdiff、imcomplement、imlincomb

残り3つの関数どもの処理例が以下に。

imMul03 = immultiply(imB, 0.3);
imAbsD = imabsdiff(imMul03, imB);
imComp = imcomplement(imB);
imlinC = imlincomb(0.5, imB, 0.5, imP);
subplot(151); title('B'); imshow(imB);
subplot(152); title('B * 0.3'); imshow(imMul03);
subplot(153); title('|B * 0.3 - B|'); imshow(imAbsD);
subplot(154); title('~B'); imshow(imComp);
subplot(155); title('0.5*B + 0.5*P'); imshow(imlinC);

処理結果の画像がこちら。ImageArith_samples2

これで画像の算術演算もバッチリ? あたりまえか。

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

手習ひデジタル信号処理(144) Scilab、{IPCV}、画像の強化と修復、その1 へ進む