Visual Basic とOpenCVを使ったプログラムを紹介します。Visual Basic でOpenCV⑧で紹介したクラスを使用し、ガンマ補正を行います。
ガンマ補正
画像のガンマ補正を行うプログラムを紹介します。先のプログラムと異なるのは派生クラスの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 を採用しますが、この値を画像に合わせて適切に変更すると良好な結果を得られます。
実行
以降に、実行例を示します。