nao-milkの経験ブログ

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

Excel(VBA)で拡大/縮小処理の確認(バイリニア補間追加)

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

拡大/縮小処理に「バイリニア補間処理」を追加した場合の画像をご紹介します。

前回の「Excel(VBA)で拡大/縮小処理の確認」を改造し、少し画質が良くなったものとなります。

(バイリニア補間の詳細は、ネットで検索すると演算式が出てきますので、割愛します。)

nao-milk.hatenablog.com

 

バイリニア補間画像

以下に画像を示します。

※前回の「単純に参照画素を出力」する方法を「近傍法」と言います。

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

拡大縮小画像(バイリニア補間)


近傍法より、バイリニア補間法がキレイに見えると思います。

 

補足)

 バイリニア補間法より「バイキュービック補間法」という方法がキレイになります。

 

VBAの追加変更箇所

バイリニア補間を追加/変更箇所を以下に示します。

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

VBA記述(追加変更箇所)

配列Pix()を追加し、GetPix()とBilinear()を追加しました。

GetPix()は、参照画素の座標を指定し、入力画像から画素値を取得します。

ただし、

入力画像範囲外の座標を指定した場合は端の画素を取得できるようになっています。

 

GetPix()記述

GetPixのVBA記述を以下に示します。

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

VBA記述(GetPix)

Bilinear()記述

BilinearのVBA記述を以下に示します。

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

VBA記述(Bilinear)

バイリニアは、4画素に対して重み付けを行い、その合計を結果として出力します。

Pix(0)が注目画素となり、その周辺画素がPix(1)~(3)になります。

 Pix(0) = 座標(x,y)

 Pix(1) = 座標(x+1,y)

 Pix(2) = 座標(x,Y+1)

 Pix(3) = 座標(x+1,y+1)

 

引数DtXがX方向の小数部、DtYがY方向の小数部となります。

変倍カウンタ CtXの下位16bit、CtYの下位16bitが小数部です。

 

各重み付けは、

X方向の重み付けしてからY方向の重み付けを行います。

これはビットオーバーフロー(演算結果が32bit以上)を防ぐため整数値に戻してから次のY方向の重み付けを行います。

演算式をbit幅で表すと「9bit×17bit×17bit」となり、演算結果の必要bit数は43bitとなり、Long型の32bit超えます。

 

そこで、最初に

 X方向:9bit×17bit → 26bit → (2^16=65536[17bit])で割り、9bitにして

 Y方向:9bit×17bit → 26bit → (2^16=65536[17bit])で割り、9bitにしています。

 

最後に

今回は、補間処理に関して紹介しました。

拡大/縮小では、参照画素を出力するだけではカクカクした画像になり、補間処理を行うことで滑らかになります。