nao-milkの経験ブログ

25年間の半導体エンジニア経験で知り得た内容を記載したブログです。

Excel(VBA)で拡大/縮小処理の確認

f:id:nao-milk:20210402164348p:plain

拡大/縮小処理のプログラムをExcel VBAで作成しました。

尚、生成中は浮動小数演算を使用せず固定小数を用いています。

 

 

 参考記事

拡大/縮小処理は、以下の記事を参照ください。

nao-milk.hatenablog.com

 

浮動小数を使用しない演算については、以下の2つの記事を参照ください。 

nao-milk.hatenablog.com

 

nao-milk.hatenablog.com

 

どのような画像になるのか

横×縦=32×32画素の入力画像をVBAで0.75倍、1.25倍した画像を以下に示します。

尚、バイリニアなどの補間処理は行っていません。

※画素値は0~511までの範囲をとり、0が白、511に近づくほど青になっていきます。

f:id:nao-milk:20210402142328p:plain

拡大縮小画像(±0.25)

 

プログラム構成

Subプロシージャのみとなり、以下がプログラムです。

このプログラムの特徴は以下の通りです。

  1. 横と縦の変倍率は独立しています。(ParaRateXとParaRateY)
  2. 入力画像の横と縦のサイズは指定が可能。(ParaISizeXとParaISizeY)
  3. 出力画像の横と縦のサイズは指定が可能。(ParaOSizeXとParaOSizeY)
  4. 変倍カウンタの小数部のbit幅は指定が可能。(ParaBtSize)
  5. 拡大/縮小時、入力画像が無い場合は、出力画素値を「-1」にします。

 

f:id:nao-milk:20210402145025p:plain

VBA記述(BigSmall)

パラメータ取得(11~17行目)

シート「パラメータ」で設定された値を取得します。(以下、シート「パラメータ」の抜粋)

f:id:nao-milk:20210402145230p:plain

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」を示し、「浮動小数値」は変倍率から浮動小数で計算したカウンタ値になります。

 

f:id:nao-milk:20210402162504p:plain

変倍カウンタ値

  

最後に

画質は参照画素をそのまま出力しているため、悪いですが、変倍カウンタは浮動小数で計算した場合と誤差1画素となります。

画質評価で小数部のbit幅を増やすなどで設計検討したりします。