Excel(VBA)で拡大/縮小処理の確認
拡大/縮小処理のプログラムをExcel VBAで作成しました。
尚、生成中は浮動小数演算を使用せず固定小数を用いています。
参考記事
拡大/縮小処理は、以下の記事を参照ください。
浮動小数を使用しない演算については、以下の2つの記事を参照ください。
どのような画像になるのか
横×縦=32×32画素の入力画像をVBAで0.75倍、1.25倍した画像を以下に示します。
尚、バイリニアなどの補間処理は行っていません。
※画素値は0~511までの範囲をとり、0が白、511に近づくほど青になっていきます。
プログラム構成
Subプロシージャのみとなり、以下がプログラムです。
このプログラムの特徴は以下の通りです。
- 横と縦の変倍率は独立しています。(ParaRateXとParaRateY)
- 入力画像の横と縦のサイズは指定が可能。(ParaISizeXとParaISizeY)
- 出力画像の横と縦のサイズは指定が可能。(ParaOSizeXとParaOSizeY)
- 変倍カウンタの小数部のbit幅は指定が可能。(ParaBtSize)
- 拡大/縮小時、入力画像が無い場合は、出力画素値を「-1」にします。
パラメータ取得(11~17行目)
シート「パラメータ」で設定された値を取得します。(以下、シート「パラメータ」の抜粋)
B列の「設定値」を変更し、[拡大/縮小 開始]ボタンをクリックすると、シート「Image」にある入力画像を拡大又は縮小して結果をシート「出力」に出力します。
冒頭の画像(「拡大縮小画像(±0.25)」)が抜粋したものになります。
カウンタ加算値(25~28行目)
変倍率から変倍カウンタの加算値を算出します。(25,27行目)
また、浮動小数から固定小数に変換します。(26,28行目)
小数部のbit幅は、シート「パラメータ」の"変倍カウンタ小数部bit幅"で指定した値を使用します。(このプログラムでは、16bitに設定しています。)
カウンタ動作(43~68行目)
横と縦方向にカウンタを動作させて拡大又は縮小処理を行います。
X方向 及び Y方向の出力画素数は、変数OtX及びOtYで管理し、出力画像サイズまで動作します。
また、変倍カウンタは変数CtX及びCtYとなり、カウンタ加算値で算出した値を毎回加算します。
拡大/縮小時に入力画像から参照する画素は変数CtXとCtYの整数部になり、その整数部(入力画像の参照画素位置)は、変数ItX及びItYとなります。
尚、変数DtXとDtYは小数部となります。(補間時に使用する目的で残しています。)
54行目で変数ItXとItYからシート「Image」にある入力画像から画素を参照し、変数OutValueに代入します。
その後、
61行目で出力画素位置(変数OtXとOtY)で示す位置にOutValueの値を出力します。
(シート「出力」に出力します。)
変倍カウンタ動作
拡大及び縮小時のカウンタ動作を以下に示します。
「カウンタ値」欄は、VBAからExcelに表示させた値となり、
「整数部」欄は、「カウンタ値 / 65536」の整数値を示し、
「小数部」欄は、「カウンタ値 % 65536」の値を示します。
また、「(小数値)」欄は、「小数部 / 65536」を示し、「浮動小数値」は変倍率から浮動小数で計算したカウンタ値になります。
最後に
画質は参照画素をそのまま出力しているため、悪いですが、変倍カウンタは浮動小数で計算した場合と誤差1画素となります。
画質評価で小数部のbit幅を増やすなどで設計検討したりします。