OpenCVにはcvGammaのようなガンマ補正の関数は無いのですが、ルックアップテーブルを使った輝度値変換の関数(cvLUT)はあるので、これを使ってガンマ補正を行いたいと思います。
以下、ガンマ補正のサンプルプログラムです。OpenCV2.2を用いて、作成しています。
#include "stdafx.h"
//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// 『C:\OpenCV2.2\include』を追加のこと
#include "opencv2\\opencv.hpp"
#ifdef _DEBUG
//Debugモードの場合
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220d.lib")
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220d.lib")
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220d.lib")
#else
//Releaseモードの場合
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220.lib")
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220.lib")
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220.lib")
#endif
//---------------------------------------------------------------
//【関数名 】:cv_Gamma
//【処理概要】:ガンマ補正
//【引数 】:src = 入力画像
// :dst = 出力画像
// :gamma = ガンマ補正値
//【戻り値 】:なし
//【備考 】:モノクロ/カラー対応可
// :カラーの場合はRGB全て同じガンマ補正値
//---------------------------------------------------------------
void cv_Gamma(IplImage* src, IplImage* dst, double gamma){
int i;
uchar LUT[256];
//ガンマ補正テーブルの作成
for (i = 0; i < 256; i++)
{
LUT[i] = (int)(pow((double)i / 255.0, 1.0 / gamma) * 255.0);
}
//CvMatへ変換
CvMat lut_mat = cvMat(1, 256, CV_8UC1, LUT);
//ルックアップテーブル変換
cvLUT(src, dst, &lut_mat);
}
int _tmain(int argc, _TCHAR* argv[])
{
//画像データの読込
IplImage* src = cvLoadImage("Girl.bmp", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if (src == NULL){
return 0;
}
//表示ウィンドウの作成
cvNamedWindow("src");
cvNamedWindow("dst");
//処理後画像データの確保
IplImage* dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
//ガンマ補正
cv_Gamma(src, dst, 2.0);
//画像の表示
cvShowImage ("src", src);
cvShowImage ("dst", dst);
//キー入力待ち
cvWaitKey (0);
//全てのウィンドウの削除
cvDestroyAllWindows();
//画像データの解放
cvReleaseImage(&src);
cvReleaseImage(&dst);
return 0;
}
サンプルプログラムのダウンロードはこちらより。
gamma-correction-opencv-sample.zip
(OpenCV2.2対応。Visual Studio 2010 C++ Expressにより作成)
実行例
OpenCV2.2の使用方法および、ガンマ補正については下記のページを参照下さい。
コメント
[…] Here’s one that I adapted from a Japanese site, utilizing look up table. […]