nao-milkの経験ブログ

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

Excel(VBA)でRGB2YUVの確認

 

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

 前回の「浮動小数を使用せず演算」で記載したRGB→YUV変換(演算式②)の精度を確認するため、Excel VBAでプログラムを作りました。

 

Excelを使用することにより、以下のように画像確認ができます。 

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

Excelでの確認例

 

前回の参考記事は、以下になります。

nao-milk.hatenablog.com

 

 

前回の内容

 以下がYUV変換(演算式②)となります。

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

係数は以下の通りとなり、n=16(×65536)VBAを作成しました。

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

 

VBAを使う理由

演算精度を確認する場合、Excelが便利です。

が、一番の理由は視覚的にすぐ修正できる所です。

特に画像処理の場合は、期待値を作るのと同時作業ができます。

 

補足)

 半導体設計では、期待値というものを作る必要があります。

 これは設計した回路が正しく出力されているかシミュレーションで確認するためのものです。

 回路では並列処理のためFFでバトンリレーのように処理します。

 一つでもタイミングがズレていたりすると出力値が違ってくるためそれを確認します。

 画像処理では、何万というデータがあります。

 その一つ一つを正しく出力しているか、期待値を準備して比較アプリ(コマンド)で確認します。

 ※目視確認では何万とういうデータを確認する為に時間がかかるため。

 

 (この期待値を作るために、C言語VBAを自然と勉強してしまいます。)

 

プログラム構成

テストがしやすいように2階層に分かれています。

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

階層構造

 

各Functionの概要と引数は以下の通りとなります。

 

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

 

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

 

Function CalcRGB2YUV

R,G,B成分と係数やClip処理用変数を受け、演算します。

また、上位階層で係数を負数(-???)で設定することにより、U,V成分の演算が可能になります。

 

記述

VBAプログラムは以下の通りです。

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

CalcRGB2YUV()の記述

 

検証

Functionを使用しているため、Excelのユーザー定義マクロとして使用できます。

従って、Excelを使って簡単に検証(デバッグ)が可能です。

 

確認内容を以下に示します。

「入力値」の各RGB成分使って「通常係数」の場合と「係数×65536」で計算します。

「通常係数」が浮動小数で演算した値を示し、「係数×65536」がCalcRGB2YUVで演算した値となります。

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

CalcRGB2YUVの検証

上表より、各YUV成分の整数部の誤差は1と分かります。
 

Function RGB2YUV

 引数Pointに指定したセルの背景色から各RGBを取得し、YUV変換の計算を行います。

 

記述

VBAプログラムは以下の通りです。

YUV変換で必要な各パラメータは「Const」で指定できるようにしています。

精度を変更する場合でもこのConstの値を変更するだけで良いようになっています。

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

RGB2YUV()の記述

Y成分は「ValueY」、U成分は「ValueU」、V成分は「ValueV」に代入し、変数Modeの設定値に応じて選択して返します。

 

検証

 入力用のシートを準備し、Y,U,V成分の値を出力し、確認します。

 

入力画像

入力画像を以下に示します。

簡易的にテストするため、縦横32画素としています。

 

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

入力画像

 入力画像は以下の式で生成しています。

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

入力画像生成式

Cells(Y + 2, X + 2).Interior.Color」の記述でセルに色を設定しています。

 

出力値

RGB2YUV()のPointに入力画像の各セルを指定し、Y成分、U成分、V成分の値をセルに出力し、色付けして確認します。

 

各結果を以下に示します。

 

Y成分結果

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

Y成分結果

 

U成分結果

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

U成分結果
V成分結果

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

V成分結果

最後に

画像処理のデバッグ段階では、Excelを使った方が便利です。

画像のように2次元的に見れるのと、シミュレーション結果との違いも色をつけたり、視覚的にとらえることが可能です。

 

ただ、欠点もあります。

  1. デバッグ時の小さいサイズならExcelの実行時間に問題はないですが、実サイズ検証で大きいサイズになると実行時間がかかり不向きです。
  2. VBAC言語と構文が違うため、C言語の移植が大変です。

 

私の場合(半導体設計時)は、ブロック単位のデバッグ時はExcelで期待値を作って視覚的にデータ解析を行います。

その後、C言語を使って大きいサイズの期待値を作成し、期待値比較確認を行うようにしています。