//---------------------------------------------------------------------
//概要		: 画像の膨張、収縮を行う
//File Name	: morphology.cpp
//Library	: OpenCV for MS-Windows 1.0
//---------------------------------------------------------------------

#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

#define THRESHOLD	128			//	2値化の際の閾値
#define THRESHOLD_MAX_VALUE	255	//	2値化の際に使用する最大値

#define DILATIONS	3	//	膨張回数
#define EROSIONS	3	//	収縮回数

int main( int argc, char* argv[] ) {	
	char windowNameBinary[]="Binary";	//	2値画像を表示するウィンドウの名前
	char windowNameDilate[]="Dilate";	//	膨張画像を表示するウィンドウの名前
	char windowNameErode[]="Erode";		//	収縮画像を表示するウィンドウの名前

	//	画像を読み込む
	IplImage  *sourceImage = cvLoadImage( "image/source.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );

	if ( sourceImage == NULL ) {
		//	画像が見つからない場合
		printf( "画像が見つかりません\n" );
		return -1;
	}

	//	画像を生成する
	IplImage  *grayImage = cvCreateImage( cvGetSize(sourceImage), IPL_DEPTH_8U, 1 );		//	グレースケール画像用IplImage
	IplImage  *binaryImage = cvCreateImage( cvGetSize(sourceImage), IPL_DEPTH_8U, 1 );		//	2値画像用IplImage
	IplImage  *dilationImage = cvCreateImage( cvGetSize(sourceImage), IPL_DEPTH_8U, 1 );	//	膨張画像用IplImage
	IplImage  *erosionImage = cvCreateImage( cvGetSize(sourceImage), IPL_DEPTH_8U, 1 ); 	//	収縮画像用IplImage
	
	//	BGRからグレースケールに変換する
	cvCvtColor( sourceImage, grayImage, CV_BGR2GRAY );

	//	グレースケールから2値に変換する
	cvThreshold( grayImage, binaryImage, THRESHOLD, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY );

	//	DILATIONS回 膨張処理を行う　
	cvDilate( binaryImage , dilationImage, NULL, DILATIONS );
	
	//	EROSIONS回　収縮処理を行う
	cvErode( dilationImage, erosionImage, NULL, EROSIONS );

	//	ウィンドウを生成する
	cvNamedWindow( windowNameBinary,CV_WINDOW_AUTOSIZE );
	cvNamedWindow( windowNameDilate,CV_WINDOW_AUTOSIZE );
	cvNamedWindow( windowNameErode,CV_WINDOW_AUTOSIZE );
	
	//	画像を表示する
   	cvShowImage( windowNameBinary, binaryImage );
	cvShowImage( windowNameDilate, dilationImage );
	cvShowImage( windowNameErode,erosionImage );
    
	//	キー入力を待つ
    cvWaitKey( 0 );

	//	画像を保存する
    cvSaveImage( "image/erosion.bmp",erosionImage );
	cvSaveImage( "image/dilation.bmp",dilationImage );
    
	//	メモリを解放する
	cvReleaseImage( &sourceImage );
	cvReleaseImage( &grayImage );
	cvReleaseImage( &binaryImage );
	cvReleaseImage( &dilationImage );
	cvReleaseImage( &erosionImage );
	//	ウィンドウを破棄する
	cvDestroyWindow( windowNameBinary );
	cvDestroyWindow( windowNameDilate );
	cvDestroyWindow( windowNameErode );

	return 0;
}
