Visual Basic でOpenCV⑨ - ガンマ補正

Visual BasicOpenCVを使ったプログラムを紹介します。Visual BasicOpenCVで紹介したクラスを使用し、ガンマ補正を行います。

ガンマ補正

画像のガンマ補正を行うプログラムを紹介します。先のプログラムと異なるのは派生クラスのCCvFunc.vb のみですので、そのソースリストのみを示します。

Imports OpenCvSharp

Namespace CCvLibrary
    Public Class CCvFunc
        Inherits CCv

        'コンストラクタ
        Public Sub New()
            MyBase.New()
        End Sub

        ' OpenCVを使用して処理
        Public Function DoCvFunction() As Bitmap
            Dim gamma = 2.0                 ' create LUT
            Dim lut = New Byte(255) {}
            For i = 0 To 255
                lut(i) = Math.Pow(CDbl(i) / 255.0, 1 / gamma) * 255.0
            Next
            Dim lutMat As Mat = New Mat(1, 256, MatType.CV_8UC1, lut)

            mDst = New Mat()
            Cv2.LUT(mSrc, lutMat, mDst)     ' Gamma

            Return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mDst)
        End Function
    End Class

End Namespace

ルックアップテーブル(Lookup Table、LUT)を使用しガンマ補正を行います。元の画素からLUTを引くことによって補正を行います。ガンマ補正では、補正値をγ、補正前の輝度値をsrc、補正後の輝度値をdst とすると、補正式は以下のようになります。

この式をすべての画素に対して実行しても構いませんが、非常に効率が悪いです。上記の値をあらかじめ計算し、画素値が取りうる数の配列を作り、そこへ上記の値を設定します。画素値で、そのテーブルを参照すると計算量が格段に減少します。前式は、プログラムの
lut(i) = Math.Pow(CDbl(i) / 255.0, 1 / gamma) * 255.0
に対応します。
補正値 γ は、変数gamma を使用しますが、式としてはまったく同じであることが分かるでしょう。この配列をMat オブジェクトへ変換し、Cv2.LUT でガンマ補正を行います。この例では γ に2.0 を採用しますが、この値を画像に合わせて適切に変更すると良好な結果を得られます。

実行

以降に、実行例を示します。