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

📄 imgfunction.cpp

📁 基于小波的SAR斑点处理
💻 CPP
字号:
#include "stdafx.h"
#include "Progress.h"
#include "Comput.h"
#include "ImgFunction.h"

#include <math.h>

static int HIGHER[7][7]=
{
	{-1,0,-1,-1,-1,-1,-10000},/*  (  */
	{-10000,1,1,1,1,1,1},/*  )  */
	{-1,1,1,1,-1,-1,1},/*  +  */
	{-1,1,1,1,-1,-1,1},/*  -  */
	{-1,1,1,1,1,1,1}, /*  *  */
	{-1,1,1,1,1,1,1}, /*  /  */
	{-1,-10000,-1,-1,-1,-1,0}  /*  #  */
};

void ChangeExt(LPCTSTR s1,char *s2,char *NewExt)
{
	unsigned int i;
	for(i=0;i<strlen(s1);i++)
	{
		if(*(s1+i)=='.')
			break;
	}
	strncpy(s2,s1,i+1);
	*(s2+i+1)='\0';
	strcat(s2,NewExt);
}

int IsWhite(char c)
{
	if(c==' '||c==9)
		return 1;
	else return 0;
}

int Higher(struct OPTR Optr1,struct OPTR Optr2)
{
	if(Optr1.Type==FUNCTION&&Optr2.Type==FUNCTION)
		return 1;/*Higher*/
	else if(Optr1.Type==FUNCTION&&(Optr2.Type==DELIMITER&&Optr2.Flag==0))
		return -1;
	else if(Optr1.Type==FUNCTION&&(Optr2.Type==DELIMITER&&Optr2.Flag!=0))
		return 1;
	else if(Optr1.Type==DELIMITER&&Optr2.Type==DELIMITER)
		return(HIGHER[Optr1.Flag][Optr2.Flag]);
	else /*if(Optr1.Type==DELIMITER&&Optr2.Type==FUCTION)*/
	{
		if(Optr1.Flag==1)
			return  -10000;
		else
			return -1;
	}
}

float Operate(float Var1,float Var2,int Flag)
{
	switch(Flag)
	{
	case 2://+
		return Var1+Var2;
	case 3:
		return Var1-Var2;
	case 4:
		return Var1*Var2;
	case 5:
		return (float)(Var1/(Var2+0.00001));
	}
	return 0.0;
}

void Operate(float *Res,BYTE *Var1,BYTE *Var2,int Height,int Width,int Flag)
{
	DWORD Order;
	int RPro;
	int Process = 0;
	for(int i=0;i<Height;i++)
	{
		RPro=(int)(100.0 * (i+1) / Height);
		if(RPro>Process)
		{
			for(int j=0;j<RPro-Process;j++)
				UpdateStatusBar();
			Process=RPro;
		}
		for(int j=0;j<Width;j++)
		{
			Order = (DWORD)i*Width+j;
			switch(Flag)
			{
			case 2://+
				Res[Order] = (float)Var1[Order]+(float)Var2[Order];
				break;
			case 3:
				Res[Order] = (float)Var1[Order]-(float)Var2[Order];
				break;
			case 4:
				Res[Order] = (float)Var1[Order]*(float)Var2[Order];
				break;
			case 5:
				Res[Order] = float(Var1[Order]/((float)Var2[Order]+0.00001));
				break;
			}
		}
	}
}

void Operate(float *Res,BYTE *Var1,float Var2,int Height,int Width,int Flag)
{
	DWORD Order;
	int RPro;
	int Process = 0;
	for(int i=0;i<Height;i++)
	{
		RPro=(int)(100.0 * (i+1) / Height);
		if(RPro>Process)
		{
			for(int j=0;j<RPro-Process;j++)
				UpdateStatusBar();
			Process=RPro;
		}
		for(int j=0;j<Width;j++)
		{
			Order = (DWORD)i*Width+j;
			switch(Flag)
			{
			case 2://+
				Res[Order] = (float)Var1[Order]+Var2;
				break;
			case 3:
				Res[Order] = (float)Var1[Order]-Var2;
				break;
			case 4:
				Res[Order] = (float)Var1[Order]*Var2;
				break;
			case 5:
				Res[Order] = float(Var1[Order]/(Var2+0.00001));
				break;
			}
		}
	}
}

void Operate(float *Res,BYTE *Var1,float *Var2,int Height,int Width,int Flag)
{
	DWORD Order;
	int RPro;
	int Process = 0;
	for(int i=0;i<Height;i++)
	{
		RPro=(int)(100.0 * (i+1) / Height);
		if(RPro>Process)
		{
			for(int j=0;j<RPro-Process;j++)
				UpdateStatusBar();
			Process=RPro;
		}
		for(int j=0;j<Width;j++)
		{
			Order = (DWORD)i*Width+j;
			switch(Flag)
			{
			case 2://+
				Res[Order] = (float)Var1[Order]+Var2[Order];
				break;
			case 3:
				Res[Order] = (float)Var1[Order]-Var2[Order];
				break;
			case 4:
				Res[Order] = (float)Var1[Order]*Var2[Order];
				break;
			case 5:
				Res[Order] = float(Var1[Order]/(Var2[Order]+0.00001));
				break;
			}
		}
	}
}

void Operate(float *Res,float Var1,BYTE *Var2,int Height,int Width,int Flag)
{
	DWORD Order;
	int RPro;
	int Process = 0;
	for(int i=0;i<Height;i++)
	{
		RPro=(int)(100.0 * (i+1) / Height);
		if(RPro>Process)
		{
			for(int j=0;j<RPro-Process;j++)
				UpdateStatusBar();
			Process=RPro;
		}
		for(int j=0;j<Width;j++)
		{
			Order = (DWORD)i*Width+j;
			switch(Flag)
			{
			case 2://+
				Res[Order] = Var1+(float)Var2[Order];
				break;
			case 3:
				Res[Order] = Var1-(float)Var2[Order];
				break;
			case 4:
				Res[Order] = Var1*(float)Var2[Order];
				break;
			case 5:
				Res[Order] = float(Var1/((float)Var2[Order]+0.00001));
				break;
			}
		}
	}
}

void Operate(float *Res,float Var1,float *Var2,int Height,int Width,int Flag)
{
	DWORD Order;
	int RPro;
	int Process = 0;
	for(int i=0;i<Height;i++)
	{
		RPro=(int)(100.0 * (i+1) / Height);
		if(RPro>Process)
		{
			for(int j=0;j<RPro-Process;j++)
				UpdateStatusBar();
			Process=RPro;
		}
		for(int j=0;j<Width;j++)
		{
			Order = (DWORD)i*Width+j;
			switch(Flag)
			{
			case 2://+
				Res[Order] = Var1+Var2[Order];
				break;
			case 3:
				Res[Order] = Var1-Var2[Order];
				break;
			case 4:
				Res[Order] = Var1*Var2[Order];
				break;
			case 5:
				Res[Order] = float(Var1/(Var2[Order]+0.00001));
				break;
			}
		}
	}
}

void Operate(float *Res,float *Var1,float *Var2,int Height,int Width,int Flag)
{
	DWORD Order;
	int RPro;
	int Process = 0;
	for(int i=0;i<Height;i++)
	{
		RPro=(int)(100.0 * (i+1) / Height);
		if(RPro>Process)
		{
			for(int j=0;j<RPro-Process;j++)
				UpdateStatusBar();
			Process=RPro;
		}
		for(int j=0;j<Width;j++)
		{
			Order = (DWORD)i*Width+j;
			switch(Flag)
			{
			case 2://+
				Res[Order] = Var1[Order]+Var2[Order];
				break;
			case 3:
				Res[Order] = Var1[Order]-Var2[Order];
				break;
			case 4:
				Res[Order] = Var1[Order]*Var2[Order];
				break;
			case 5:
				Res[Order] = float(Var1[Order]/(Var2[Order]+0.00001));
				break;
			}
		}
	}
}

void Operate(float *Res,float *Var1,float Var2,int Height,int Width,int Flag)
{
	DWORD Order;
	int RPro;
	int Process = 0;
	for(int i=0;i<Height;i++)
	{
		RPro=(int)(100.0 * (i+1) / Height);
		if(RPro>Process)
		{
			for(int j=0;j<RPro-Process;j++)
				UpdateStatusBar();
			Process=RPro;
		}
		for(int j=0;j<Width;j++)
		{
			Order = (DWORD)i*Width+j;
			switch(Flag)
			{
			case 2://+
				Res[Order] = Var1[Order]+Var2;
				break;
			case 3:
				Res[Order] = Var1[Order]-Var2;
				break;
			case 4:
				Res[Order] = Var1[Order]*Var2;
				break;
			case 5:
				Res[Order] = float(Var1[Order]/(Var2+0.00001));
				break;
			}
		}
	}
}

void Operate(float *Res,float *Var1,BYTE *Var2,int Height,int Width,int Flag)
{
	DWORD Order;
	int RPro;
	int Process = 0;
	for(int i=0;i<Height;i++)
	{
		RPro=(int)(100.0 * (i+1) / Height);
		if(RPro>Process)
		{
			for(int j=0;j<RPro-Process;j++)
				UpdateStatusBar();
			Process=RPro;
		}
		for(int j=0;j<Width;j++)
		{
			Order = (DWORD)i*Width+j;
			switch(Flag)
			{
			case 2://+
				Res[Order] = Var1[Order]+(float)Var2[Order];
				break;
			case 3:
				Res[Order] = Var1[Order]-(float)Var2[Order];
				break;
			case 4:
				Res[Order] = Var1[Order]*(float)Var2[Order];
				break;
			case 5:
				Res[Order] = float(Var1[Order]/((float)Var2[Order]+0.00001));
				break;
			}
		}
	}
}

float Fuction(float Var,int Flag)
{
	switch(Flag)
	{
	case 0:
		return (float)sin(Var);
	case 1:
		return (float)cos(Var);
	case 2:
		return (float)log(Var>0?Var:0.00001);
	case 3:
		return (float)sqrt(Var>0?Var:0.0);
	case 4:
		{
		double Value = exp((double)Var);
		if(Value>MAXFLOAT)
			return (float)MAXFLOAT;
		else
			return (float)Value;
		}
	case 5:
		return (float)sign(Var);
	case 6:
		return (float)fabs(Var);
	case 7:
		return (float)((int)(Var));
	}
	return 0.0;
}

void Fuction(float *Res,BYTE *Var,int Height,int Width,int Flag)
{
	DWORD Order;
	int RPro;
	int Process = 0;
	double Value;
	for(int i=0;i<Height;i++)
	{
		RPro=(int)(100.0 * (i+1) / Height);
		if(RPro>Process)
		{
			for(int j=0;j<RPro-Process;j++)
				UpdateStatusBar();
			Process=RPro;
		}
		for(int j=0;j<Width;j++)
		{
			Order = (DWORD)i*Width+j;
			switch(Flag)
			{
			case 0:
				Res[Order] = (float)sin((float)Var[Order]);
				break;
			case 1:
				Res[Order] = (float)cos((float)Var[Order]);
				break;
			case 2:
				Res[Order] = (float)log((float)Var[Order]>0?Var[Order]:0.00001);
				break;
			case 3:
				Res[Order] = (float)sqrt((float)Var[Order]);
				break;
			case 4:
			{
				Value = exp((double)Var[Order]);
				if(Value>MAXFLOAT)
					Res[Order] = (float)MAXFLOAT;
				else
				Res[Order] = (float)Value;
				break;
			}	
			case 5:
				Res[Order] = (float)sign((float)Var[Order]);
				break;
			case 6:
				Res[Order] = (float)fabs((float)Var[Order]);
				break;
			case 7:
				Res[Order] = (int)((float)Var[Order]);
				break;
			}
		}
	}
}

void Fuction(float *Res,float *Var,int Height,int Width,int Flag)
{
	DWORD Order;
	int RPro;
	int Process = 0;
	double Value;
	for(int i=0;i<Height;i++)
	{
		RPro=(int)(100.0 * (i+1) / Height);
		if(RPro>Process)
		{
			for(int j=0;j<RPro-Process;j++)
				UpdateStatusBar();
			Process=RPro;
		}
		for(int j=0;j<Width;j++)
		{
			Order = (DWORD)i*Width+j;
			switch(Flag)
			{
			case 0:
				Res[Order] = (float)sin(Var[Order]);
				break;
			case 1:
				Res[Order] = (float)cos(Var[Order]);
				break;
			case 2:
				Res[Order] = (float)log(Var[Order]>0?Var[Order]:0.00001);
				break;
			case 3:
				Res[Order] = (float)sqrt(Var[Order]>0?Var[Order]:0.0);
				break;
			case 4:
			{
				Value = exp((double)Var[Order]);
				if(Value>MAXFLOAT)
					Res[Order] = (float)MAXFLOAT;
				else
					Res[Order] = (float)Value;
				break;
			}
			case 5:
				Res[Order] = (float)sign(Var[Order]);
				break;
			case 6:
				Res[Order] = (float)fabs(Var[Order]);
				break;
			case 7:
				Res[Order] = (int)(Var[Order]);
				break;
			}
		}
	}
}

void GetIHS(BYTE *IHS,BYTE Red,BYTE Green,BYTE Blue)
{
	int Intens = (int)Red+(int)Green+(int)Blue;
	IHS[0] = Intens/3;
	if(Blue<=Green&&Blue<=Red)
	{
		if(Blue==Red&&Blue==Green)
		{
			IHS[1] = 0;
			IHS[2] = 0;
		}
		else
		{
			IHS[1] = (float)(Green-Blue)/((float)Intens-(float)Blue*3)/3*255;
			IHS[2] = ((float)Intens-(float)Blue*3)/Intens*255;
		}
	}
	else if(Red<=Blue&&Red<=Green)
	{
		if(Red==Blue&&Red==Green)
		{
			IHS[1] = 0;
			IHS[2] = 0;
		}
		else
		{
			IHS[1] = ((float)Green+(float)2*Blue-3*(float)Red)/
				((float)Intens-(float)Red*3)/3*255;
			IHS[2] = ((float)Intens-(float)Red*3)/Intens*255;
		}
	}
	else if(Green<=Blue&&Green<=Red)
	{
		if(Green==Red&&Green==Blue)
		{
			IHS[1] = 0;
			IHS[2] = 0;
		}
		else
		{
			IHS[1] = ((float)3*Red+(float)2*Blue-5*(float)Green)/
				((float)Intens-(float)Green*3)/3*255;
			IHS[2] = ((float)Intens-(float)Green*3)/Intens*255;
		}
	}
}

void GetRGB(BYTE *RGB,BYTE Intensity,BYTE Hue,BYTE Saturation)
{
	float I;
	float H;
	float S;
	I = Intensity*3;
	H = (float)Hue/255*3;
	S = (float)Saturation/255;
	if(H<1&&H>=0)
	{
		RGB[0] = I/3*(1+2*S-3*S*H);
		RGB[1] = I/3*(1-S+3*S*H);
		RGB[2] = I/3*(1-S);
	}
	else if(H<2&&H>=1)
	{
		RGB[0] = I/3*(1-S);
		RGB[1] = I/3*(1+5*S-3*S*H);
		RGB[2] = I/3*(1-4*S+3*S*H);
	}
	else
	{
		RGB[0] = I/3*(1-7*S+3*S*H);
		RGB[1] = I/3*(1-S);
		RGB[2] = I/3*(1+8*S-3*S*H);
	}
}

BOOL IsAllFileExist(CPtrArray &aFileNameArray)
{
	CString *pszTemp;
	CFileStatus rStatus;
	for(int i=0;i<aFileNameArray.GetSize();i++)
	{
		pszTemp = (CString *)(aFileNameArray[i]);
		if(!CFile::GetStatus(*pszTemp,rStatus))
		{
			return FALSE;
		}
	}
	return TRUE;
}

void myline(int x1,int y1,int x2,int y2,POINT *lpPoint)
{
	ASSERT(lpPoint!=NULL);
	int delta_x,delta_y;
	int inc_x,inc_y;
	int dist;
	int t;
	int xerr=0,yerr=0;
	delta_x=x2-x1;
	delta_y=y2-y1;
	if(delta_x>0)
		inc_x=1;
	else if(delta_x==0)
		inc_x=0;
	else 
		inc_x=-1;
	if(delta_y>0)
		inc_y=1;
	else if(delta_y==0)
		inc_y=0;
	else inc_y=-1;
		delta_x=abs(delta_x);
	delta_y=abs(delta_y);
	if(delta_x>delta_y)
		dist=delta_x;
	else
		dist=delta_y;
	for(t=0;t<=dist;t++)
	{
		lpPoint[t].x = x1;
		lpPoint[t].y = y1;
		xerr+=delta_x;
		yerr+=delta_y;
		if(xerr>=dist)
		{
			xerr-=dist;
			x1+=inc_x;
		}
		if(yerr>=dist)
		{
			yerr-=dist;
			y1+=inc_y;
		}
	}
}

⌨️ 快捷键说明

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