📄 sample.c
字号:
/*
** 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 + -