メモ置き場

メモ置き場です.開発したものや調べたことについて書きます.

[tex: ]

RGB565をVerilog HDLでグレースケールに変換する

FPGA(Nexys4 DDR)を使ったリアルタイムエッジ検出 - メモ置き場
この記事でのプロジェクトでは,カメラから送られてくるRGB565の画像をグレースケールに変換してからフィルタ処理を行なっている.
RGB565からグレースケールへの変換について説明しておく.



レースケールへの変換は,各色に重みをつけて平均をとることで達成できる.
なんで単純平均じゃないのか,というと人間の目は色によって明るさの感じ方が若干違うために,重み付け平均をとるのだそう.こちらの記事*1が参考になった.

さて,具体的にRGBからグレースケールへの変換だが,次のように計算する

\begin{align}
\mathrm{Gray} = 0.299R + 0.587G + 0.114B
\end{align}

これをVerilog HDLで実装したいが,そのまま小数点演算はかけないので次のように各係数を2の冪の和に近似する*2
\begin{align}
0.299 &\sim \frac{1}{2^2} + \frac{1}{2^5} = 0.28125 \\
0.578 &\sim \frac{1}{2^1} + \frac{1}{2^4} = 0.5625 \\
0.114 &\sim \frac{1}{2^4} + \frac{1}{2^5} = 0.09375
\end{align}
2の冪はビットシフトで表現できるので,
\begin{align}
\mathrm{Gray} = (R>>2) + (R>>5) + (G>>1) + (G>>4) + (B>>4) + (B>>5)
\end{align}
とすればグレースケールへの変換ができる.