5.10. ビット演算

前のページの算術演算はピクセル -- 整数の明るさやパックされたカラーワード -- に対して動作します。ビット演算はそれより1段階低く、それらの値の内部にある個々のビットに対して動作します。各ピクセルがちょうど1ビットであるバイナリ画像では、ビット演算が自然な算術となります。

5.10.1. ビット演算ファミリー

Image クラスは、2入力ビット演算の完全なセットを公開しています。

各演算は、両画像のバッファのすべてのバイトに対してビットごとに動作します。各バイトが8ピクセルを保持するバイナリ画像では、演算は処理されるバイトあたり8ピクセルに対して実行されます。グレースケールまたはカラー画像では、すべてのチャンネルのすべてのビットに対して実行されます。

AND、OR、XOR の3つの真理値表を 横に並べたもの。各表には入力の組み合わせ 0-0、0-1、1-0、1-1 に対応する4行と、 A、B、結果のラベルが付いた列があります。 真理値表の下に、2つの小さなバイナリ画像 A と B が黒と白のセルのグリッドとして 描かれ、それらの AND を取った結果が右側に、 両方で白だったセルのみを残したグリッドと して示されます。

上部: AND、OR、XOR の真理値表 -- 各演算のビットレベルの意味論です。下部: 2つのバイナリ画像 A と B、そして A.b_and(B) の結果。結果は両方の入力でオンだった位置のみを残します。

5.10.2. マスクの組み合わせ

これらの演算の最も一般的な用途はマスクの組み合わせです。マスクとは、位置ごとに何らかの条件が満たされているかどうかを示すバイナリ画像です。異なる条件を記述する2つのマスクは、ビット演算の1つを通じて、複合条件を記述する単一のマスクへと組み合わされます。

b_and() は、その位置で両方の入力マスクがオンだった場合にのみオンになる位置を持つマスクを生成します -- 2つの条件の自然な「かつ」です。前景マスクをしきい値処理パスの出力と b_and で組み合わせると、しきい値の一致が前景に制限されます。

b_or() は、どちらかの入力マスクがオンであればいつでもオンになる位置を持つマスクを生成します -- 自然な「または」です。2つのしきい値処理出力を OR で組み合わせると、2つのカラー範囲のいずれかに一致したものすべてをカバーする単一のマスクが生成されます。

b_xor() は、ちょうど一方の入力マスクがオンであればいつでもオンになる位置を持つマスクを生成します。2つのマスクが一致しない位置を検出するのに役立ちます -- しきい値出力が2つのフレーム間で変化した位置、2つの参照マスク間の対称差、といったものです。

否定版 -- b_nand()b_nor()b_xnor() -- は、否定されていない対応物の補集合を生成します。これらは、条件を記述する自然な方法が「これらのいずれでもない」または「両方ではない」である場合に役立ちます。一般的ではありませんが、否定を AND の後に別途 invert() を続けて構成する必要がないよう、存在を知っておく価値があります。

5.10.3. 非バイナリ画像でのビット演算

ビット演算はグレースケール画像とカラー画像でも動作します。それらが最も役立つのは、画像がバイナリのような内容を保持している場合 -- ピクセルがすべて 0255 であるグレースケールフレーム、完全な黒と完全な白のピクセルのみを持つ RGB565 フレーム -- であり、そこでは AND、OR、XOR が真のバイナリ画像の場合と同じ組み合わせを与えます。値の全範囲にわたる画像については、通常、前のページの算術演算の方が適しています。