5.12. 二値しきい値処理¶
多くの画像処理パイプラインは、各ピクセルに関する問いに帰着します。この輝度は「前景」を意味する範囲内にあるか。この色は、アプリケーションが追跡しているマーカーである赤に十分近いか。このピクセルは、パイプラインの次の段階が注目すべき候補集合の一部か。しきい値処理とは、こうした問いをすべての位置で二値の答え(ピクセルが一致すればオン、一致しなければオフ)に変える演算であり、画像全体をパイプラインの残りの部分が扱えるマスクへと縮約します。
5.12.1. binary メソッド¶
binary() メソッドは、その分類を一度の呼び出しですべてのピクセルにわたって実行します。これはしきい値範囲のリスト(ピクセルが「オン」としてカウントされるために一致できる条件)を受け取り、少なくとも1つの範囲に一致したすべてのピクセルをフォーマットの最大値に、一致しなかったすべてのピクセルをゼロに書き換えます。その結果が、パイプラインの残りの部分が直接利用できる二値マスクです。
最も単純な形式では、しきい値リストには1つの範囲があり、呼び出しはその範囲内のピクセルのマスクを返します。
img.binary([(120, 255)])
リスト形式こそが binary を強力にしています。2つの色付きマーカー、あるいは輝度範囲に加えて孤立した彩度ピークを追跡したいパイプラインは、両方の範囲を同じリストで渡し、すべての一致を網羅する単一の出力マスクを得ます。
しきい値処理は、連続値の画像を二値マスクに変えます。しきい値範囲内のすべてのピクセルはフォーマットの最大値になり、範囲外のすべてのピクセルはゼロになります。¶
5.12.2. グレースケールのタプル¶
グレースケール画像の場合、しきい値リストの各エントリは、含む形式の輝度範囲を表す2要素のタプル (lo, hi) です。lo と hi の間(両端を含む)の値のピクセルが一致し、その範囲外のものは一致しません。自然なパターンは分かりやすいものです。
(0, 60)は暗いピクセルに一致します。黒から濃いグレーまですべてです。(180, 255)は明るいピクセルに一致します。明るいグレーから白まですべてです。(100, 160)は中間のグレーのピクセルに一致します。輝度範囲の中央の帯です。
タプル内の2つの値の順序は重要ではありません。lo が hi より大きい場合はメソッドが内部でそれらを入れ替えるため、(60, 0) は (0, 60) と同じように動作します。
5.12.3. カラー用の LAB タプル¶
RGB565画像の場合、各エントリは6要素のタプル (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi) で、赤、緑、青で直接ではなくLAB色空間における含む形式の範囲を表します。しきい値は L(明度)、A(緑から赤への色度軸)、B(青から黄への色度軸)であり、それぞれそのチャンネルにおけるピクセルの値と比較されます。
RGBを直接しきい値処理するのではなくLABを経由する理由は、LAB色空間が設計の中心に据えた性質です。LABは明度を色度から分離します。同じ色を異なる輝度で示す2つのピクセルは、L値は異なりますが、AとBの値はほぼ同じになります。その分離により、しきい値範囲はAとBの軸上の位置によって色を記述でき、L範囲を広く開けたままにして、影からハイライトまであらゆる輝度でその色を受け入れられます。RGBベースのしきい値処理ではこれはできません。照明のいかなる変化もR、G、Bの3つの値を同時に動かし、RGBしきい値に基づいて構築された追跡器は、雲が太陽の前を通過した最初の瞬間に破綻します。
実践的なパターンは、アプリケーションが追跡している色を記述するAとBの範囲を選び、L範囲は広く(多くの場合 (0, 100) であらゆる輝度を受け入れる)開けておくことです。アプリケーションが色だけでなく輝度でもしきい値処理したい場合は別です。
6つに満たない値を持つタプルの場合、欠けた要素は最大範囲(その軸に制約なし)がデフォルトになります。したがって、RGB565のしきい値リスト内の2要素タプル (l_lo, l_hi) は明度のみでしきい値処理し、あらゆる色に一致します。
注釈
本当に大きく開いたL範囲には、下端に落とし穴があります。明度がゼロに向かって下がるにつれて、あらゆる色が黒に収束し、AとBの値はゼロに向かって崩れ、ノイズに支配されるようになります。そのため暗いピクセルがAとBの範囲に紛れ込み、目的の色として追跡されてしまうことがあります。シーンの黒い領域が一致として点灯する場合は、それらが脱落するまで l_lo を上げてください。
5.12.4. フラグ¶
3つのキーワード引数が出力を制御します。
invert=Trueは結果を反転します。一致していたはずのすべてのピクセルがゼロになり、ゼロだったはずのすべてのピクセルが最大値になります。前景を記述する自然な方法が、それが何でないかによる場合に便利です。zero=Trueは動作モードを変えます。一致するピクセルがゼロにされ、一致しないピクセルは元の値を保ちます。画像を一致するピクセルの二値マスクに縮約するのではなく、画像から一致するピクセルを消去することが目的の場合に使用します。to_bitmap=Trueは、ソースの既存のフォーマットを上書きする代わりに、結果をBINARY画像として返します。1ピクセルあたり1ビットの結果は、後続のマスク引数が直接受け入れるものであり、この変換は完全なフォーマットのマスクを持ち回ることによるメモリ圧迫をしばしば節約します。
マスクとROIは、この機能群の残りの部分と同じ規約に従います。roi 矩形は演算を部分領域に限定し、mask 画像は演算を任意の位置パターンに限定します。
5.12.5. デフォルトでインプレース¶
算術演算と同様に、binary はデフォルトでインプレースで実行されます。ソース画像のピクセルが二値出力で上書きされ、呼び出し後は元の値が失われます。to_bitmap=True 形式は、ソースを保持する必要があり、出力が新しく割り当てられた BINARY 画像であるべき場合の代替手段です。新しいバッファ上に同じフォーマットの結果を得るための copy=True 形式も受け付けられます。