アンシャープマスキング(Unsharp Masking)もOpenCVに無い関数の1つのなのですが、OpenCVには任意カーネルを指定してフィルタ処理を行っているcvFilter2Dという関数があるので、これを使ってアンシャープマスキングを実現する手法を紹介します。
アンシャープマスキングのアルゴリズムについては以前、アンシャープマスキング(鮮鋭化フィルタ)のページで紹介しているので、そちらを参照願います。
以下、アンシャープマスキングのサンプルプログラムです。OpenCV2.2を用いて、作成しています。
// UnsharpMasking.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #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_UnsharpMasking //【処理概要】:アンシャープマスキング //【引数 】:src = 入力画像 // :dst = 出力画像 // :k = 鮮鋭化の強さ //【戻り値 】:なし //【備考 】: //--------------------------------------------------------------- void cv_UnsharpMasking(IplImage* src, IplImage* dst, float k){ //カーネルの設定 float KernelData[] = { -k/9.0f, -k/9.0f, -k/9.0f, -k/9.0f, 1 + (8 * k)/9.0f, -k/9.0f, -k/9.0f, -k/9.0f, -k/9.0f, }; //カーネルの配列をCvMatへ変換 CvMat kernel = cvMat (3, 3, CV_32F, KernelData); //フィルタ処理 cvFilter2D (src, dst, &kernel); } int _tmain(int argc, _TCHAR* argv[]) { //画像データの読込 IplImage* src = cvLoadImage("sample.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_UnsharpMasking(src, dst, 2.0f); //画像の表示 cvShowImage ("src", src); cvShowImage ("dst", dst); //キー入力待ち cvWaitKey (0); //全てのウィンドウの削除 cvDestroyAllWindows(); //画像データの解放 cvReleaseImage(&src); cvReleaseImage(&dst); return 0; }
サンプルプログラムのダウンロードはこちらより。
(OpenCV2.2対応。Visual Studio 2010 C++ Expressにより作成)
実行例
このサンプルプログラムは、任意カーネルフィルタのサンプルにもなっているので、プログラム中のKernelDataの値をいろいろと変えてみるのも面白いと思います。