⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample.c

📁 可调节自适应滤波器-代码-ERDAS版本
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
** System Includes.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
/*
** Erdas Toolkit Includes.
*/
#include	<eint.h>
#include 	<eeml.h>
#include	<eeml_frame.h>
#include	<eeml_part.h>
#include	<eeml_dialog.h>
#include	<eeml_cellarray.h>
#include 	<eimg.h>
#include	<estr.h>
#include	<evue.h>
#include	<efio.h>
#include	<emsc.h>
#include	<egda.h>
#include	<esmg.h>

/* ---------------------------  Defines  ------------------------------- */
#define	APP_TITLE "Sample Application (%s)"
#define VIEWER_X 100
#define VIEWER_Y 100
#define VIEWER_WIDTH 512
#define VIEWER_HEIGHT 512

/* ---------------------------- Typedefs ------------------------------- */
typedef struct _MyData 
{	
	/*
	** Toolkit Package informations.
	*/
	Eint_InitToolkitData *erdinit; /* Erdas toolkit init struct */
	Eui_Root *root;               /* EML root */
	Eml_ParseResult *result;     /* EML parser result */


	/*
	** Frame parts we are interested in.
	*/
	Eui_BasePart *sampleFrame;
	Eui_BasePart *aPart;
	Eui_BasePart *bPart;
	Eui_BasePart *applyitPart;
	Eui_BasePart *stopitPart;
	Eui_BasePart *win_sizePart;
	Eui_BasePart *fileinPart;
	Eui_BasePart *fileoutPart;

	/*
	** Misl info.
	*/
	char fileinname[ESTR_MAX_PATH_LEN];
	char fileoutname[ESTR_MAX_PATH_LEN];
	Estr_StringList *layerNames;	/* Image layers */
	
	int windowsize;
	float a;
	float b;
	long npixx,npixy;

	/*
	** Viewer connection info.
	*/
	Evue_Connection		*apCon;		/* application connection */
	Evue_DisplayHandle	displaynum;	/* display handle */
	Evue_LayerHandle	layer_id;	/* layer handle */
	Eimg_Layer		*outlayer;
	Eimg_PixelRect *pixelblock;

} MyData;



/*
** --------------------- EML callbacks -----------------------
*/
static int  applyitPartCB __(( Eui_BasePart * , Emsc_Opaque *));


/*
** --------------------- Local functions -----------------------
*/
static void findParts __((MyData *, Eerr_ErrorReport **));
static int FilterImage __((MyData *));
static void AdaptiveFilter __((MyData *,Eimg_PixelRect *, Eimg_PixelRect *));
static void GetXmeanDmean __((Eimg_PixelRect *, long,long,int,double *,double *));
static double GetT __((double,double,double));
static double GetTn(double,double,double);
static double getK(double,double,double);

/*---------- Translation table for application functions ------------*/
//static Eeml_TranslationTable appFunc[] = {"applyit", applyitCB,NULL, NULL};



static Emet_MeterInfo *meterinfo = NULL;


/*
**************************************************************************
** main:
**	The main entry function for the filter program.
**************************************************************************
*/
int 
main(argc, argv)
int argc;
char *argv[];
{
	char *functionname= "Speckle Filter:main";
	Eerr_ErrorReport *err = NULL;
	MyData	*myData = (MyData *)NULL;
	int comCount;
	char **comBuf;
	char *applicationName = "Speckle Filter";
	Emsc_Opaque *context=NULL;

	/*
	** Allocate our data.
	*/
	myData = emsc_New(1, MyData);
	myData->fileinname[0] = '\0';
	myData->fileoutname[0] = '\0';
	myData->layerNames = NULL;
	myData->apCon = (Evue_Connection *)NULL;
	myData->displaynum = (Evue_DisplayHandle)NULL;
	myData->layer_id = (Evue_LayerHandle)NULL;
	myData->outlayer = NULL;
	myData->pixelblock = NULL;

	/*
	** Initilize the ERDAS Toolkit Package (ELIB).
	*/
	myData->erdinit = eint_InitToolkit((Emsc_Opaque **)&err );
	if (err) 
	{
		eerr_PrintErrorReport(err,EERR_DEBUG,NULL);
		return(1);
	}


	/*
	** Initilize the ERDAS EML Toolkit Package (EMLLIB).
	*/
	myData->root = eeml_Init(myData->erdinit, applicationName,argc, argv, &err);
	if (err) 
	{
		eerr_PrintErrorReport(err,EERR_DEBUG,NULL);
		return(2);
	}	


	/*
	** Parse the sample.eml macro file for our GUI. Also, 
	** set our application functions and pass our data 
	** structure to be passed back to those functions by EML.
	*/
	myData->result = eeml_ParseVa(ELEX_FILE, "sample.eml",
		myData->root->rootPart, &err,
		//EEML_PARSE_OPTION_APP_FUNCTIONS, NULL,
		EEML_PARSE_OPTION_APP_CONTEXT, (Emsc_Opaque *)myData,
		NULL);
	if (err) 
	{
        eerr_PrintErrorReport(err,EERR_DEBUG,NULL);
        return(3);
	}
	
	/*
	** Find the parts needed.
	*/
	findParts(myData,&err);
	if (err) 
	{
        eerr_PrintErrorReport(err,EERR_DEBUG,NULL);
        return(4);
	}

	/*
	** Add callback on view button.
	*/
	eeml_AddCallback(myData->applyitPart, applyitPartCB,(Emsc_Opaque *)myData,  "mousedown", &err);


	//设置a b viewer 的初始值
	eeml_NumberPartValueSet(myData->aPart, 0.60, &err);
	eeml_NumberPartValueSet(myData->bPart, 0.80, &err);



	/*
	** Finally, display our sample frame.
	*/
 	eeml_DisplayFrame(myData->sampleFrame, &err);
	if (err) 
	{
        eerr_PrintErrorReport(err,EERR_DEBUG,NULL);
        return(7);
	}

	
	/*
	** Start the EML Main Loop.
	*/
	while (!myData->root->doneFlag) 
	{
		comCount = 0;
		eeml_GetNextCommand(myData->root,&context,&comCount,
			&comBuf, &err);
			
	}


	/*
	** Free the command.
	*/
	eeml_RemoveCallback(myData->applyitPart, applyitPartCB, "mousedown", &err);

	eeml_RemoveFrame(myData->sampleFrame, &err);
	eeml_FreeCommand(comCount, comBuf, &err);
	emsc_Free(myData);
	
	/*
	** Normal return.
	*/
	return(0);

}


/*
************************************************************************
** findParts:
************************************************************************
**
** Description:
**	Find all the parts we are interested in.
************************************************************************
*/
static void
findParts(md, errptr)
MyData *md;
Eerr_ErrorReport **errptr;
{
	*errptr = NULL;
	
	/*
	** The main frame.
	*/
	md->sampleFrame = eeml_FindPart(md->result,"sample_frame", errptr);
	if (*errptr) return;

	md->aPart = eeml_FindPart(md->result,"sample_frame:a", errptr);
	if (*errptr) return;

	md->bPart = eeml_FindPart(md->result,"sample_frame:b", errptr);
	if (*errptr) return;

	md->win_sizePart = eeml_FindPart(md->result,"sample_frame:win_size", errptr);
	if (*errptr) return;

	md->fileinPart = eeml_FindPart(md->result,"sample_frame:filein", errptr);
	if (*errptr) return;
	md->fileoutPart = eeml_FindPart(md->result,"sample_frame:fileout", errptr);
	if (*errptr) return;

	md->applyitPart = eeml_FindPart(md->result,"sample_frame:applyit", errptr);
	if (*errptr) return;

	md->stopitPart = eeml_FindPart(md->result,"sample_frame:stopit", errptr);
	if (*errptr) return;

}


static int
applyitPartCB (part, calldata)
Eui_BasePart *part;
Emsc_Opaque *calldata;
{
	MyData *md = (MyData *)calldata;
	Eerr_ErrorReport *err=NULL;
	char msg[ESTR_MAX_PATH_LEN];
	char cWindowsize[10];
	

	if (md==NULL)
	{
		eeml_DialogMessage(md->sampleFrame, "md is wrong", &err);
		return 1;
	}

	//得到输入和输出文件名:
	strcpy(md->fileinname , eeml_StringPartValueGet(md->fileinPart,&err));
	strcpy(md->fileoutname , eeml_StringPartValueGet(md->fileoutPart,&err));
	
	if(md->fileinname[0] == '\0' || md->fileoutname[0] == '\0')
	{
		eeml_DialogMessage(md->sampleFrame, "Please input the sourceFile and destFile ! ", &err);
		return 2;
	}


	//得到a b的值
	md->a = (float)eeml_NumberPartValueGet(md->aPart,&err);
	md->b = (float)eeml_NumberPartValueGet(md->bPart,&err);

	//得到窗口的值:
	strcpy(cWindowsize , eeml_StringPartValueGet(md->win_sizePart,&err));
	if(strcmp(cWindowsize,"5 X 5") == 0)
	{
		md->windowsize = 5;
	}
	else if(strcmp(cWindowsize,"3 X 3") == 0)
	{
		md->windowsize = 3;
	}
	else if(strcmp(cWindowsize,"7 X 7") == 0)
	{
		md->windowsize = 7;
	}
	else if(strcmp(cWindowsize,"9 X 9") == 0)
	{
		md->windowsize = 9;
	}
	else if(strcmp(cWindowsize,"11 X 11") == 0)
	{
		md->windowsize = 11;
	}
	else if(strcmp(cWindowsize,"13 X 13") == 0)
	{
		md->windowsize = 13;
	}
	else if(strcmp(cWindowsize,"15 X 15") == 0)
	{
		md->windowsize = 15;
	}
	else
	{
		md->windowsize = 5;
	}

	meterinfo = emet_MeterInfoCreate(NULL,"Process",stdout,&err);

	
	//将原始文件拷贝一份
	eimg_FileCopy(md->fileinname,md->fileoutname,md->erdinit,&err,EIMG_COPY_OPTION_END);
    if (err)
	{
        return 3;
    }

	
	//打开拷贝的文件,将其读入内存
	md->layerNames = eimg_LayerGetNames(md->fileoutname,md->erdinit,&err);
	if( !md->layerNames || err)
	{
		return 4;
	}

	md->outlayer = eimg_LayerOpen(md->layerNames->strings[0], md->erdinit,&err,EIMG_LAYER_OPTION_COMPUTE_STATS_ON_CLOSE,
            EIMG_LAYER_OPTION_END);
    if (!md->outlayer || err)
	{
        return 5;
    }

	/*
	**将整幅图层读入md->pixelblock中
	*/

	md->npixx = md->outlayer->width;
	md->npixy = md->outlayer->height;

	md->pixelblock = eimg_PixelRectCreate(md->npixx, md->npixy, EGDA_TYPE_F64, &err);
	if(!md->pixelblock || err)
	{
		return 6;
	}

	eimg_LayerRead(md->outlayer, 0, 0, md->npixx, md->npixy, md->pixelblock, &err);
	if(err)
	{
		return 7;
	}

	//**************************************************************************************


	//滤波部分:   改变md->pixelblock中的数据,也就是滤波部分
	if(FilterImage(md))
	{
		eeml_DialogMessage(md->sampleFrame, "Filter Image Wrong ! ", &err);
		return 99;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -