スポンサーリンク
スポンサーリンク

【OpenCV】RGB成分を分けて階調変換を行う【Python】

 

以前「階調変換」を行う記事を公開しましたが、今回は「RGB成分」のどれか1つだけに反映させる方法を紹介します。

【OpenCV】ルックアップテーブルを用いた階調変換【Python】

画像を読み込む

 

今回使用する画像はこちらです。

こちらはフリー素材ですので、ご自由にダウンロードしてください。

雲海と山並み | 無料の写真素材はフリー素材のぱくたそ
「雲海と山並み」のフリー素材

(main.py)

 

画像読み込みはこれだけで完了です。

非常に簡単です。

ルックアップテーブル

 

次にルックアップテーブルと呼ばれるものを作成します。

ルックアップテーブルについて簡単に説明すると、例えばネガポジ転換と呼ばれる手法では、

\(f(x) = 255 – x\)

この式をルックアップテーブルにセットする場合、以下のようになります。

(LUTの配列番号→値)

x255x
0255
1254
2253

2541
2550

「LUTの配列番号」と一致する「元の画像の画素値」は、その配列番号に格納されている値に変換されます。

他にも様々な式がありますが、今回は3つの例を紹介するとともに、RGB成分を分けて行う階調変換を解説していきます。

 

ネガポジ転換

 

それではネガポジ転換と呼ばれる階調変換を行っていきますが、今回はRGB成分を分けて階調変換を行うので、R成分(赤色)に対してだけネガポジ転換を行っていきます。

 

ネガポジ転換の式

ネガポジ転換は、暗部と明部を取り替えるので、「0〜255」の数字をすべて逆にします。

よって式は以下のようになります。

\(f(x) = 255 – x\)

プログラム

(main.py)

結果

 

 

元々R成分が少ない画像なので、ネガポジ転換を行うと真っ赤な印象を受ける画像になりました。

 

ガンマ変換

 

次はガンマ変換をG成分(緑色)のみに反映させます。

 

ガンマ変換の式

ガンマ変換は、明るさを変えるために用いられます。

ガンマ変換の式は以下のようになります。

γ = ガンマ値
\(f(x) = \displaystyle \frac{x}{255}^\frac{1}{γ}\)

今回はガンマを「2.2」に設定しました。

この値を変えることで明るさを調整することができます。

 

プログラム

(main.py)

結果

 

 

自然の緑がさらに緑がかってどこか幻想的な雰囲気が漂います。

 

オリジナル関数

 

階調変換を行う際には「\(f(x) = 関数式\)」のように関数式を立てるので、自分でオリジナルの関数を作ることも当然可能です。

そこで、カスタマイズの例として以下の関数を用意し、B成分(青色)だけに反映させます。

 

オリジナル関数の式

オリジナル関数の式は以下のようにしました。

\(f(x) = \displaystyle \frac{x}{\log_{2}x} \times \sin \displaystyle \frac{x\pi}{256} \times 12\)

注意点

この関数の注意点として、「\(x = 0\)」の時と「\(x = 1\)」の時は値を「0」にするなどして、計算の際のエラーを回避する必要があります。

・\(x = 0\)の時

\(log_{2}0\)は「\(-\infty\)」を指してしまうので、計算の際にエラーが発生します。

・\(x = 1\)の時

\(log_{2}1 = 0\)なのですが、この関数では「0」で割ってしまうことになるため、値が存在しないことになります。

 

プログラム

(main.py)

結果

 

 

青々しい空になりました。空気が気持ちよさそうですね。

コメント