【画像処理】トーンカーブ(線形濃度変換)の原理・計算式

この記事では、画像処理における線形濃度変換(トーンカーブ)の原理や仕組みについてまとめました。

線形濃度変換

線形濃度変換とは、横軸を入力画像の画素値、縦軸を出力画像の画素値とする線形マッピングです。
GIMPやPhotoshopなどの画像加工ソフトに濃度を変更するツールとして組み込まれています。
線形濃度変換は、画像のコントラストを調整し、画像を人が視認しやすいように変換することができます。
今回は、線形濃度変換の代表例をいくつか紹介します。

変換① 画素値をa倍

入力画像の画素値をI(x, y)とすると、a倍した出力画像の画素値I'(x, y)}は次式で計算できます。

(1) \begin{eqnarray*} I'(x, y)=aI(x, y) \end{eqnarray*}

説明
a>1 コントラストが高くなる
a=1 変化なし
a<1 コントラストが低くなる


グラフ描画用プログラム(Python)

変換② コントラストを全体的に明るく・暗く

コントラストを全体的に「明るく」or「暗く」することを考えます。

入力画像の画素値をI(x, y)とすると、出力画像の画素値I'(x, y)}は次式で計算できます。

(2) \begin{eqnarray*} I'(x, y)= \begin{cases}  I(x, y)+k \hspace{30px} (I(x, y)+k<255 )\\\  255 \hspace{30px} (I(x, y)+k>256)\\  0 \hspace{30px} (I(x, y)-k<0) \end{cases} \end{eqnarray*}

パラメータ 説明
k>0 コントラストが全体的に明るくなる
k<0 コントラストが全体的に暗くなる

kの絶対値が大きいほど効果も大きくなります

グラフ描画用プログラム(Python)

変換③ コントラストの強弱

入力画像の画素値をI(x, y)とすると、コントラストの強弱を調整した出力画像の画素値I'(x, y)}は次式で計算できます。

(3) \begin{eqnarray*} I'(x, y)= \begin{cases}  0 \hspace{30px} (T<0 )\\  a(I(x, y)-127)+127 \hspace{30px} (0\le T\le255)\\ 255 \hspace{30px} (T>255) \end{cases} \end{eqnarray*}

説明
a>1 コントラストを強める
a<1 コントラストを弱める


グラフ描画用プログラム(Python)

変換④ ヒストグラムの拡張(伸張)

ヒストグラムの拡張(伸張)とは、画素値の分布が特定の範囲に偏っている場合に、広い範囲に拡張(伸長)する濃度変換です。

画素値の分布をZ_{min}Z_{max}の範囲に引き伸ばすとします。
このとき、入力画像の画素値をI(x, y)とすると、出力画像の画素値I'(x, y)}は次式で計算できます。

(4) \begin{eqnarray*} I'(x, y)=I_{max}\frac{I(x, y) - Z_{min}}{Z_{max} - Z_{min} } \end{eqnarray*}

ここで、I_{max}は入力画像の画素値の最大値です。

実装例(プログラム)

実装例(サンプルプログラム)を以下にまとめました。
【Python/OpenCV】線形濃度変換(ヒストグラム拡張など)

【関連記事】
【画像処理入門】アルゴリズム&プログラミング

シェア&フォローお願いします!