前回はベクタライズ処理のため、画像をメモリ上に列行列化して展開するim2col関数を練習。でも、ベクタライゼーションの功徳は処理速度です。今回は同じ画像に対してベクタライズ対応の処理関数とそうでないものでどのくらい速度差が出るのかを観察してみます。まあ、Helpファイルの処理例を並べて比べてみただけなんだけれども。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。
今回比べてみる関数ども
今回は以下の3関数の処理結果だけでなく、処理にかかった「ザックリした時間」を比べてみたいと思います。
-
- imblockproc
- imblockslide
- imcolproc
第1の imblockproc 関数は、指定サイズのブロック処理を「真正面から」画像上で繰り返すものです。個別ブロックには重なりはなく、ブロックサイズによりトビトビというかガタガタな結果が得られるもの。
第2の imblockslide 関数も、指定サイズのブロック処理を画像上で繰り返すのですが、次のブロックは前のブロックと一ピクセルだけずれるスライド処理になっているようです。よって上の imblockproc関数の処理負荷と比べると相当に重い処理になる筈。
第3の imcolproc 関数は、第2の imblockslide 関数と処理的には同じだけれども、列行列化した上でベクタ処理をしている関数みたいです。この処理速度を拝見すればベクタライゼーションの功徳が分かるというもの。
比較用の処理例
Helpファイルでは各関数毎にバラバラに処理をして結果の画像を眺めるだけに終わってました。以下では、3関数の結果を並べて比べられるようにしたうえで、各処理にかかる時間を tic()とtoc()で測ってます。まあ大体の処理時間 [秒] です。
A = imread(fullpath(getIPCVpath() + "/images/balloons_gray.png")); deff('y=myfunc1(x)','y = mean(x)'); tic();ybp = imblockproc(A,[9 9],'myfunc1');tbp=toc(); tic();ybs = imblockslide(A,[9 9],'myfunc1');tbs=toc(); deff('y=myfunc2(x)','y = mean(x,1)'); tic();ycp = imcolproc(A,[9 9],'myfunc2');tcp=toc(); printf("imblockproc: %7.4f imblockslide: %7.4f imcolproc: %7.4f\n", tbp, tbs, tcp); scf(0); clf; subplot(221); title('Original'); imshow(A); subplot(222); title('imblockproc'); imshow(ybp); subplot(223); title('imblockslide'); imshow(ybs); subplot(224); title('imcolproc'); imshow(ycp);
実行結果
左上がオリジナル画像、右上が imblockprocです。ガタガタな粗い画像ぞなもし、下の2つ imblockslideと、imcolprocの処理は同じハズ。
黄色がベクタライズせずに真正面から処理に取り組んでいる imblockslide の処理時間。51秒越え。一方、imcolproc は 約0.74秒とな。処理時間が約70分の1くらいになっとりますなあ。これぞベクタライゼーションの功徳じゃと。なお処理負荷の単純計算からいうと81分の1が最短のハズだけれども、いろいろあるのでそこまでは無理ってこと。でもありがたや。