Laplacian
  

ラプラシアンフィルタ

ラプラシアンフィルタは空間2次微分を計算し、輪郭を検出するフィルタです。 このフィルタは輝度の差分の変化量が極端に大きくなっている部分を抽出するフィルタです。
ラプラシアンフィルタとは、一般的にエッジ検出や先鋭化に用いられる二次微分フィルタの一種です。

フィルタの種類を3x3、5x5それぞれについて実行します。

原画とラプラシアンフィルタ

ライブラリ関数

MvcFlt2_Laplacian3x3
	int MvcFlt2_Laplacian3x3 ( HANDLE hDst, HANDLE hSrcA,
					 RECT* rcDst, RECT* rcSrcA )

戻り値
	0:正常終了  1:DIB画像がない

引数
	hDst	ラプラシアンフィルタ処理後画像
	hSrcA	ラプラシアンフィルタ処理元画像
	rcDst	処理範囲hDst
	rcSrcA	処理範囲hSrcA

説明
	選択範囲内の画面に対し、ラプラシアンフィルタ処理を行います。
	画像データの変化部分を強調します。
	使用している係数(3×3)は、以下の通りです。

	


MvcFlt2_Laplacian5x5
	int MvcFlt2_Laplacian5x5 ( HANDLE hDst, HANDLE hSrcA,
					 RECT* rcDst, RECT* rcSrcA )

戻り値
	0:正常終了  1:DIB画像がない

引数
	hDst	ラプラシアンフィルタ処理後画像
	hSrcA	ラプラシアンフィルタ処理元画像
	rcDst	処理範囲hDst
	rcSrcA	処理範囲hSrcA

説明
	選択範囲内の画面に対し、ラプラシアンフィルタ処理を行います。
	画像データの変化部分を強調します。
	使用している係数(5×5)は、以下の通りです。

	

ソースコード

/////////////////////////////////////////////////////////
// Laplacian.cpp : ラプラシアンフィルタのサンプルプログラム
//
// このプログラムは画像ファイルを入力し、
// ラプラシアンフィルタ処理を実行するサンプルプログラムです。
//
// フィルタのパラメータはファイルから入力します。
// ファイル名:Laplacian.txt
//
// 1行目:選択
//
// 選択
// 0 : 3*3
// 1 : 5*5
/////////////////////////////////////////////////////////
#include "stdafx.h"

#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>


#include "MvcFlt2.h"
#include "MvcDib.h"
#include "MvcUtil.h"
#include "MicroViewer.h"
#include <algorithm> // for std::swap
char *img_name = "Image/Filter/Filter03.bmp";	// 画像ファイル名
char text1[256];							// 結果表示用テキストバッファ
DWORD dwTime;

int main(int argc, char* argv[])
{
	 
	RECT rcP = {-1, -1, -1, -1};
	int Width ,Height;
	

	if(MvcFlt2_Init() != 0)
	{
		printf("MvcFlt2 初期化処理エラー\n");
		exit(1);
	}
	if(MvcUtil_Init() != 0)
	{
		printf("MvcUtil 初期化処理エラー\n");
		exit(1);
	}
	printf("ラプラシアンフィルタのサンプルプログラム\n");
	printf("3×3/5×5 の2種類から選択できます。\n\n");

	 HANDLE Input = mvLoadFromFile(img_name,8);		// 画像を読み込む
	 MvViewer Viewer1 = mvCreate("入力画像表示");	// ビュアーを作る
	 mvShow(Viewer1, Input);						// 入力画像を表示する
	
  // mvGetRect(Viewer1, &rcP);						// 検索範囲の設定

  // 出力用の画像を作る
	Width  = MvcDib_GetXsize(Input);
	Height = MvcDib_GetYsize(Input);

	rcP.top    = 0;
	rcP.bottom = Height -1;
	rcP.left   = 0;
	rcP.right  = Width -1;

	HANDLE Output = MvcDib_Create(Width, Height, 1, 4);  // 画像処理エリアの確保

//	MvcDib_GrayFromColor(Output, Input, 0);         // カラーからグレー変換
//	MvViewer Viewer2 = mvCreate("濃淡画像表示");	// ビュアーを作る
//	mvShow(Viewer2, Output);						// 濃淡画像を表示する

	/*------------------ラプラシアンフィルタ3×3 ------------------------*/
	// 処理時間計測開始
	Vstart_timer();
	// ラプラシアンフィルタ3×3
	MvcFlt2_Laplacian3x3(Output, Input, &rcP, &rcP);
	// 処理時間計測終了
	Vread_Utimer(&dwTime);
	// ビュアーを作る
	MvViewer Viewer2 = mvCreate("ラプラシアンフィルタ3×3");  
    // 濃淡画像を表示する
	mvShow(Viewer2, Output);
	
	// グラフィクス表示の消去
   	 MvcUtil_DrawClear();
	printf("\n【ラプラシアンフィルタ3×3 処理結果】\n");
	printf("\t処理時間 : %.2lf msec\n",(double)dwTime / 1000);
	sprintf(text1, " ラプラシアンフィルタ3×3 : %.2lf msec",(double)dwTime / 1000);
   	 MvcUtil_DrawText(rcP.left + 20, rcP.top + 20,text1, GREEN);
	MvcUtil_Paint(mvGetDC(Viewer2));

/*------------------ラプラシアンフィルタ5×5 ------------------------*/

	// 処理時間計測開始
	Vstart_timer();
	// ラプラシアンフィルタ5×5
	MvcFlt2_Laplacian5x5(Output, Input, &rcP, &rcP);
	// 処理時間計測終了
	Vread_Utimer(&dwTime);
	// ビュアーを作る
	MvViewer Viewer3 = mvCreate("ラプラシアンフィルタ5×5");  
    // 濃淡画像を表示する
	mvShow(Viewer3, Output);
	
	// グラフィクス表示の消去
    	MvcUtil_DrawClear();
	printf("\n【ラプラシアンフィルタ5×5 処理結果】\n");
	printf("\t処理時間 : %.2lf msec\n",(double)dwTime / 1000);
	sprintf(text1, " ラプラシアンフィルタ 5×5: %.2lf msec",(double)dwTime / 1000);
    	MvcUtil_DrawText(rcP.left + 20, rcP.top + 20,text1, GREEN);
	MvcUtil_Paint(mvGetDC(Viewer3));
/*------------キー 待ち --------------------------------------------*/

	printf("\n キー入力すると終了します\n");

	mvWait();
/*------------キー 待ち --------------------------------------------*/

	MvcFlt2_Fini();
	MvcUtil_Fini();	
 // ビュアーを破棄
	mvDestroy(Viewer1);
	mvDestroy(Viewer2);
	mvDestroy(Viewer3);
// 画像メモリの開放
	MvcDib_Destroy(Input);
	MvcDib_Destroy(Output);

  return 0;
}