概要
OpenCV でネガポジ反転やポスタリゼーションなどの階調変換を画像に適用する方法を紹介します。
階調変換
画素値の入力を x∈[0,255] としたとき、f(x)=y∈[0,255] という関数で変換することを階調変換 (gray level transformation)、階調変換を規定する関数を階調変換関数 (gray level transformation function) といいます。
実装上は、画素値は [0,255] の 256 種類なので、入力値の変換後の値を格納した長さが 256 の 1 次元配列である LUT (Look Up Table) を用意して階調変換を行います。例えば、LUT[0] = 100
だった場合、入力値 0 は値 100 に変換されることを意味します。
cv2.LUT
OpenCV では、cv2.LUT() で階調変換が行えます。
引数
名前 |
型 |
デフォルト値 |
src |
ndarray |
|
入力画像 |
lut |
sequence of int |
|
Look Up Table の略。[0, 255] の値の変換後の値を (256,) の1次元配列で表す。例えば、lut[10] は入力10の変換後の値を表す。 |
sample.jpg
ネガポジ反転
画素値を反転させる階調変換をネガポジ反転といいます。
f(x)=255–x
2 値化
閾値などの条件で入力値を 2 段階にする階調変換を2 値化 (binarization) といいます。
f(x)={0255x≤thresholdその他の場合
ポスタリゼーション
色を n 段階にする階調変換をポスタリゼーション (postarization) といいます。
[0,255] の範囲に n 個の区間を用意して、各値がどの区間に属するかを numpy.digitize()
で調べて、LUT を作成します。
ソラリゼーション
過度の露光で画像の一部が反転する現象を ソラリゼーション (solarization) といいます。
以下の関数でソラリゼーションを擬似的に再現できます。
f(x)={x255–xx≤thresholdその他の場合
折れ線型トーンカーブ
折れ線で表される階調変換関数を折れ線型トーンカーブといいます。
コントラストを上げる (1)
f(x)={t255255x≤tx>t=clip(t255,0,255)
sample2.jpg
コントラストを上げる (2)
f(x)=255255–tx+t
コントラストを下げる (1)
f(x)={0255255+bx–bx≤tx>t=clip(255255+bx–b,0,255)ただし、b は次を解いて得られる値です。
255255+bt–b=0
コントラストを下げる (2)
f(x)=255t
明るさ、コントラストの補正
f(x)=clip(αx+β,0,255)α はゲイン (gain) またはコントラスト (contrast)、β はバイアス (bias) または明るさ (brightness) といいます。
ガンマ補正
次の関数で行う階調変換をガンマ変換 (gamma transformation) またはガンマ補正 (gamma correction) といいます。
f(x)=(255x)γ×255γ<1 で暗く、γ>1 で明るくなるように補正できます。
gamma=0.3
の場合
gamma=3
の場合
S 字型トーンカーブ
S 字型のトーンカーブで階調変換すると、暗い部分は更に暗く、明るい部分は更に明るくすることができます。
以下の例では、arctan(x),x∈[−5,5] の値を [0,255] にスケールすることで S 字型のトーンカーブを作成しました。
コメント