アルファチャンネル
αチャンネル(アルファチャンネル)とは画像処理分野において、各ピクセルに対し色表現のデータとは別にもたせた補助データのこと。一般に画素の不透明度を表現する。
PCにおいて、プリンターやディスプレイなど、ほとんどの表示装置はRGB(Red Green Blue)、CMYK(Cyan Magenta Yellow Black)など、単色の組合せによって色を表現する。この各単色の明るさ、あるいは濃度を調整することによって人間が知覚する多くの色を表現できる。PC内部のデータでも同様の型式がとられている。
いくつかの画像データや画像ソフトでは、これらの表示される単色の他に、もうひとつ直接表示されない色のデータを追加できる。これをαチャンネルとよび、画像のマスク、複数画像の合成などに使われる。
計算式
一般にアルファチャンネルの計算は Thomas Porter および Tom Duff の1984年の論文に基づく[1]。
A および RGB の定義域は0〜1とする。A = 0 は透明で、A = 1 は不透明である。また、透明の画像は以下のように扱う。
- <math>A=0 \Rightarrow RGB=0</math>
すると、src を dst へと、アルファチャンネルつきの画像を描画する計算式は以下の通り。<math>src_F</math> や <math>dst_F</math> の定義は後述。
- <math>
\left\{ \begin{array}{l} out_A = src_A src_F + dst_A dst_F \\ out_{RGB} = (src_{RGB} src_A src_F + dst_{RGB} dst_A dst_F) \div out_A \end{array} \right. </math>
この際、以下のように、A を RGB にあらかじめかけておくと、
- <math>out_{amp} = out_{RGB} \times out_A</math>
以下のように式が簡単になる。
- <math>
\left\{ \begin{array}{l} out_A = src_A src_F + dst_A dst_F \\ out_{amp} = src_{amp} src_F + dst_{amp} dst_F \end{array} \right. </math>
積和算だけで計算できるようになるので、ビデオカード内部ではこのようにアルファチャンネルをかけておいて保持している。また、CPU で計算する際も、多くの CPU が積和算を高速に計算できるので、この形式で扱うと高速に処理できる。欠点は、各色を8ビットで保持した場合、Aが1より小さいとRGBの正確な値を保持できないことにあるが、現にほとんどのビデオカード・グラフィックスライブラリは正確に保持していない。
そして、<math>src_F</math> や <math>dst_F</math> の定義は以下の通り。SRC over DEST のように表記し、演算子は非可換であり交換法則は成立しない。
演算 | <math>src_F</math> | <math>dst_F</math> |
---|---|---|
clear | 0 | 0 |
source | 1 | 0 |
destination | 0 | 1 |
over | 1 | <math>1 - src_A</math> |
in | <math>dst_A</math> | 0 |
out | <math>1 - dst_A</math> | 0 |
atop | <math>dst_A</math> | <math>1 - src_A</math> |
xor | <math>1 - dst_A</math> | <math>1 - src_A</math> |
add | 1 | 1 |
計算結果で ARGB が 1 を超えた場合は、1 とする。
論文では、特に有用なのは、over, in, out, add としていて、一般にグラフィックライブラリが無指定で描画する際は、over が使われ、これを特にアルファブレンディングと呼ぶ。
<math>dst_A = 0</math> の透明な画像に、over, out, xor, add, source で描画すると、src の内容がそのままコピーされる。