前回は画像の空間的な変換でした。今回は画像の算術演算(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);
お猿さまと、ピーマン(唐辛子?)の混ざり具合が微妙かと。
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);
これで画像の算術演算もバッチリ? あたりまえか。