情報ラボ > 画像のビット演算
背景の上にキャラクターを重ねる。あの処理は、ANDとORで作られています。
白い背景に描かれたキャラクターを、白黒2色に分けます。この作業を二値化といいます。
元の画像いろいろな明るさの画素が混ざっています
二値化したもの黒(1)と白(0)だけになりました
縦の赤い線がしきい値です。左側(暗い)がキャラ、右側(明るい)が背景になります。
4×4の小さな画像で確かめます。マスをクリックすると、値を変えられます。
画像Aクリックで切替
画像Bクリックで切替
結果計算した値
| 演算 | 画像処理での使い道 |
|---|---|
| AND | 必要な部分だけを切り抜く(マスク処理) |
| OR | 2つの画像を重ね合わせる |
| XOR | 違いを見つける(差分の検出) |
| NOT | 白黒を反転させる |
画像編集ソフトで「背景を透明にする」「切り抜く」「重ねる」といった操作をすると、一瞬で結果が出ます。しかし内部では、すべての画素について地道な計算が行われています。
その計算の中心にあるのが、ビット演算です。論理回路で学んだAND・OR・NOT・XORが、そのまま画像処理に使われています。
画像を合成するには、どこがキャラクターでどこが背景かを、はっきり区別する必要があります。そこで最初に行うのが二値化です。
やり方は単純です。ある明るさを基準に決め、それより暗ければ1(キャラ)、明るければ0(背景)とします。この基準をしきい値(threshold)といいます。
しきい値の選び方が結果を左右します。低すぎるとキャラの一部が消え、高すぎると背景まで拾ってしまいます。上のツールで動かすと、その様子が確かめられます。
適切なしきい値を選ぶ手がかりになるのが、ヒストグラムです。横軸に明るさ、縦軸にその明るさを持つ画素の個数をとったグラフです。
キャラクターと背景がはっきり分かれている画像では、ヒストグラムに2つの山ができます。暗い側の山がキャラ、明るい側の山が背景です。この2つの山の谷の部分をしきい値に選ぶと、うまく分離できます。
この考え方を自動化した手法もあり、判別分析法(大津の二値化)などが知られています。
二値化でできた白黒の画像を、マスクといいます。型紙のようなものです。これを使って合成します。
ここでANDとORの性質が効いてきます。ANDは「0との計算は必ず0」なので、不要な部分を消せます。ORは「0との計算は相手の値がそのまま」なので、空いた場所に別の画像をはめ込めます。
単純に2枚をORで重ねるだけでは、明るい部分どうしが混ざって白飛びしてしまいます。先にANDで場所を空けておくのが、この手順の要点です。
| 演算 | 性質 | 画像処理での役割 |
|---|---|---|
| AND | 0との計算は0になる | いらない部分を消す(マスク) |
| OR | 0との計算は相手のまま | 空いた場所に重ねる |
| XOR | 同じなら0、違えば1 | 2枚の違いを見つける |
| NOT | 0と1を入れかえる | 白黒の反転、マスクの反転 |
XORには面白い性質があります。同じ値で2回XORすると、元に戻るのです。この性質は、暗号や、画面上でカーソルを重ねて描く処理に使われてきました。
ここまでは白黒で説明しましたが、カラー画像でも考え方は同じです。赤・緑・青それぞれの数値に対して、同じ演算を行います。
たとえば255(すべて1)とのANDは値をそのまま残し、0とのANDはその色を消します。特定の色成分だけを取り出す処理も、この応用です。
実際の画像編集ソフトでは、透明度(アルファ値)を使ったより滑らかな合成が行われますが、その土台にあるのは同じ考え方です。
身近な機能の多くが、論理演算という単純な計算の組み合わせでできています。
実際の画像編集ソフトでは、ANDとORより滑らかな方法が使われます。透明度を表すアルファチャンネルです。
各画素に、色の情報(RGB)に加えて透明度の値を持たせます。0なら完全に透明、255なら完全に不透明。その間の値なら半透明です。
この計算により、輪郭がなめらかに溶け込みます。ANDとORによる方法では、境界がギザギザになりがちでした。0か1かの二択しかないためです。
とはいえ、考え方の土台は同じです。「どこを残し、どこを消すか」を画素ごとに決める。その判断を、白黒の2択にするか、256段階にするかという違いにすぎません。
二値化のしきい値を人が決めるのは手間ですし、画像ごとに適切な値は変わります。そこで、自動で求める方法が考えられてきました。
代表的なのが判別分析法(大津の二値化)です。しきい値で分けた2つのグループについて、グループ内のばらつきが小さく、グループ間の差が大きくなる値を探します。ヒストグラムの谷を数学的に見つける方法だといえます。
照明のムラがある画像では、画像全体で1つのしきい値を使うとうまくいきません。その場合は、場所ごとに異なるしきい値を使う適応的二値化が有効です。