アンシャープマスキング(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の値をいろいろと変えてみるのも面白いと思います。
コメント