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

📄 comlib.h

📁 图像处理软件,功能比较基础
💻 H
字号:
/**********************    CCOMLIB Class  *******************************/
// Comlib.h: interface for the CComlib class.
/*
 *  2000/7/18:am     yang w.d.    add
 *          ModelBasedMatch()     ModelBased match function
 *
 *
 *
 *
*/
#if !defined(AFX_COMLIB_H__D54B1D06_0CE8_11D3_B159_204C4F4F5020__INCLUDED_)
#define AFX_COMLIB_H__D54B1D06_0CE8_11D3_B159_204C4F4F5020__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include "math.h"

#define		WINDOWS			100
#define		DOS				101
#define		OS				WINDOWS   
#define		PALVERSION		0x300

#define		ITERATION_NUM	43

#define		MAXGRAYLEVEL	255
#define		MAXGRAYSIZE		256

#define		ZERO	0
#define		ONE		255
#define		WSHED	0
#define		MASK	-2
#define		INIT	-1

#define		CONT_RAW  0
#define		CONT_PIC  1
#define		CONT_BMP  2

#define		ISDBS   1
#define		ISREL   0

#define		IMAGESUBPATH  "\\image\\wd\\"

#define		PI     3.141592654
#define		START  8

#define		DIR    20
#define		MPP    10   //meter per pixle

#define		HALF 9

#define		THETA2        34        // 30  ;  32
#define		THETA1        10
#define		SAMPLE_DIST   12        // 50ns--7.5 ; 80ns--12

#define		RELIMGSIZE    128        // 采样图象大小
#define		REFIMGSIZE    192        // 参考图象大小

#define		SIGMA         0.8f       // 相对最大值比例
#define		PEAKPROPB     1.25f      // 峰显著度

#define		CSPEED        0.3              //  光速(0.3m/ns)

#define		S2N         0                //  飞行方向由南向北
#define		N2S         1                //  飞行方向由北向南
#define		E2W         2                //  飞行方向由东向西
#define		W2E         3                //  飞行方向由西向东

#define		CLOCKWISE   0                //  顺时针扫描
#define		NOCLOCKWISE 1                //  逆时针扫描

#define		STARTANGLE  8                //  波束半功率点的内角(8度)
#define		ENDANGLE    32               //  波束半功率点的外角(32度)
#define		ALPHA       10               //  对成象有贡献的角度范围(+-10度)

//#define MPP         10               //  原始图采样率(m/pixle)
#define		PULSEWID    80               //  脉冲宽度(ns)
#define		SAMPLEFRE   10               //  采样频率(MHz)

#define		DEG2RAD(x)  ((x)*PI/180.0)       //  度数转换为弧度
#define		RAD2DEG(x)  ((x)*180.0/PI)       //  弧度转换为度数

#define		K(x)        (15-0.5*fabs(x)) //  根据方位角计算波宽改善因子

typedef struct tagDPOINT{
	double x;
	double y;
}DPOINT;

typedef struct tagFPOINT{
	float x;
	float y;
	int time;
}FPOINT;

typedef struct tagELEMENT{
	float x;
	float y;
	float z;
	int time;
	float value;
}ELEMENT;

typedef struct tagDREGION{
	double x0;
	double y0;
	double x1;
	double y1;
}DREGION;

typedef struct tagSPARMS{
   int x0;
   int y0;
   double localx;
   double localy;

   float hight;
   float rad0;
   float rad1;
   float res;

   int findx;
   int findy;

   BOOL bType;
   BOOL bFlightDir;
   BOOL bValid;

   // 转换相关面坐标到原始大参考图象坐标
   FPOINT TranToOrg(int x , int y)
   {
	   FPOINT ret = {0.0 ,0.0 ,0};
	   
	   if( ! bValid ) 
		   return ret;

		if( bType == ISDBS ) 
		{
			if( bFlightDir == E2W || bFlightDir == W2E )
			{
				ret.x = x0 + ( x + 64 ) * res/MPP ;
				ret.y = y0 + ( y* res + hight*tan(32.0/180*PI) ) /MPP ;
			}
			else
			{
				ret.x = x0 + ( x* res + hight*tan(32.0/180*PI) ) /MPP ;
				ret.y = y0 + ( y + 64 ) * res/MPP ;
			}
		}
		else
		{
			ret.x = x0 + ( x + 64 ) * res/MPP ;
			ret.y = y0 + ( y + 64) * res/MPP ;
		}

	   return ret;
   }
}SPARMS;

typedef struct tagRADARMSG {
	BOOL  bType;
	BOOL  bFlightDir;

	float fHight ;
	float fRes ;

	int BigSizeX;
	int BigSizeY;
	DREGION BigRefGuass;
	DPOINT LocalGuass;
}RADARMSG;

typedef struct tagNPOT {
   int x;
   int y;
   double cor;
}NPOT;

typedef struct tagCOORDINATE{
	int x;
	int y;
	int cx;
	int cy;

	int numb;
}COORDINATE;

typedef struct tagIMAGE{
	int           Row,Col;
	unsigned char **Image;

	void init(){ Row=Col=0; Image=NULL; }
	void ffree()
	{
		for(int i=0;i<Row;i++) 
			free(Image[i]);
		free(Image);
		Image=NULL;
	}
}IMAGE;

typedef struct  tagBOX{
	int x;
	int y;
	int dx;
	int dy;
}BOX;

typedef struct tagSIMAGEBOX{
	int row;
	int col;

	BOX box1;
	BOX box2;
	BOX boxL;
	BOX boxR;

	BOOL  bs1;      // 1-pic 0-raw     open as
	BOOL  bs2;      // 1-pic 0-raw
	BOOL  bd1;      // 1-pic 0-raw     save as
	BOOL  bd2;      // 1-pic 0-raw

	char  src1[80];
	char  src2[80];
	char  dig1[80];
	char  dig2[80];

	BOOL  type;      // 0-real  1-dbs  2-other
	BOOL  bEmult;    // 1-for Emult  0-dig for matching

	float res;
}SIMAGEBOX;


typedef struct  tagSEMULT{
	BOOL bType;   // Emult radar type : ISDBS(1) or ISREL(0)

	int nExtOrgimage; // 原始SAR图外扩象素,对应模拟时中心点

	float hight;
	int numbs;
	int scale;
	float res;

	// for dbs
	int cx;
	int cy;
	int size;
	int row;
	int col;
	float fdstScale ;
	float fdstTheta ;
	int bFlightDir;
	float fFlightRate;
	float startscanangle;
	int bScanDir;
	float fScanRate;
	float dd;
	float fScanTheta;  // 成像扫描角度

	// reserved
	BOOL  brel;      // 1-pic 0-raw     open as
	BOOL  bsar;      // 1-pic 0-raw
	
	char  pos[80];
	char  rel[80];
	char  sar[80];
	char  PathName[80];
}SEMULT;

// struct for rel matching  parms
typedef struct  tagSMATCH{
	BOOL	bType;  // ISDBS or ISREL(0)

	char	PathName[80];  // working PathName

	char	RelFile[80];
	char	RefFile[80];
	char    CorFile[80];
	char	PosFile[80];
	char	ResultFile[80];

	int		numbs;
	int		bsize;
	int		nErrMax;
//	float   fSigma ;	// reserved

	// for Rel radar image match
	int		height;
	float	res;

	// for dbs radar image match
	float   fRatioLR;    // L和R匹配概率权重比
	int   	bFlightDir;
	float	fScanTheta;  // 成像扫描角度
	BOOL    bVerL;
	BOOL    bVerR;

	// calulate new value
	float rad0 , rad1 ;
}SMATCH;

// struct for rel matching  parms
typedef struct  tagSPRCSCALE{
	BOOL bType;

	char	PathName[80];  // working PathName

	int		col;
	int		row;
	int		nHalfSize;

	char	SrcFile[80];
	char	DesFile[80];
}SPRCSCALE;

class CComlib  
{
public:
	CComlib();
	virtual ~CComlib();

// add new function  here in version 2.2
public:
	static SEMULT * ReadEmultProcessItem( int &numb , CString filename);
	static SMATCH * ReadMatchProcessItem( int &numb , CString filename);
	static SPRCSCALE * ReadPrcScaleItem( int &numb , CString filename);

	static BOOL PrcThenScale( SPRCSCALE in);
public:
	static void Bmp2Pic(CString FileName);
	static void Bmp24To256(CString FileName, CString OutFileName, float fScale, int x1, int x2, int y1, int y2, BOOL bPic = TRUE);
	/****************** 数据统计 *****************/
	// 统计高斯分布数据的均值和标准差Sigma
	static void GuassStatics(float *p, int length , float &avg, float &dev);

	// 对图象局部去均值处理
	static BYTE ** PreProcess(BYTE ** Src , int row , int col , int nHalfSize);
	// 均值平滑图象
	static void ImgSmooth(BYTE **Src,int nRow,int nCol,int nrRatio, int ncRatio, BYTE **Des);

	// 图象比较
	static BOOL CompareImage(CString file1,  CString file2, CString outfile);
	static BOOL AverageImage(CString file1,  CString file2, CString outfile);

	/****************** 图象变换 *****************/
	// 图象反转
	static void Inverse(BYTE** lpOrgImg, BYTE** lpOutImg, int Row, int Col);
	// 图象放缩变换
	static void ImgScale(BYTE ** src , int sr, int sc, BYTE ** des , int dr, int dc, int nScaleFactor = 3);
	// 图象旋转变换
	static BYTE ** ImgRotate(BYTE ** src , int sr, int sc , int& dr, int& dc, float theta , BOOL dir = CLOCKWISE, BYTE nBackgrd = 192);
	// 三次线性插值放缩图象
	static BYTE ** ImgScaleCubicLinear(BYTE ** src , int row, int col, int desR , int desC ) ;

	// 图象以某点为中心进行放缩与旋转变换,并对应截取某尺寸大小的子图
	// 考虑插值放大后再旋转变形等(精细)
	static BYTE ** DigDistortSubImgFine(BYTE ** src , int sRow, int sCol, int dRow, int dCol, float cR , float cC , float scale = 1 , float theta = 0) ;
	// 直接用变换矩阵变形处理(粗糙)
	static BYTE ** DigDistortSubImgFast(BYTE ** src , int sRow, int sCol, int dRow, int dCol, float cR , float cC , float scale = 1 , float theta = 0) ;

	/****************** 图象统计 *****************/
	// 计算有效范围的均值
	static float Average(BYTE ** image , BYTE ** Mask /*= NULL*/ , int r, int c);
	// 计算有效范围的标准差
	static float Deviation( BYTE ** image, BYTE ** Mask , int r, int c);
	// 统计有效范围的直方图
	static int * Histogram( BYTE ** image, BYTE ** Mask , int r, int c);

	static float ucAverage(unsigned char **a,int YStart,int XStart,int row,int col, int margin);
	static float ucDeviation(unsigned char **a,int YStart,int XStart,int row,int col, float average,int margin);

	/************ DSP数据格式转反与保存 ***********/
	// 保存为DSP数据格式文件
	static void SaveAsDspDataFile(void * data, int size, DWORD address, CString outfile, char cTYPE);
	// 读取DSP数据格式文件到数组
	static void LoadAsDspDataFile(void * data, int *psize, CString outfile, char cType);

	/************** 数据归一化为图象 *************/
	// 将float数据归一化为图象数据输出
	static BOOL NormalizeToByte(float ** p, int r, int c, CString outfile, BOOL bVert = TRUE);
	static BOOL NormalizeToByte3(float ** p, int r, int c, CString outfile);
	static BOOL NormalizeToByte(float ** p, BYTE ** q, int r, int c, BOOL bVert = FALSE);
	static BOOL NormalizeToByte(float *  p, int r, int c, CString outfile, BOOL bVert = TRUE);
	
	static BYTE** NormalizeFloat(float **Float,short YStart,short XStart,
		short Row,short Col,short Min,short Max,short Margin);
	static float fMax2d(float **a,short YStart,short XStart,short row,short col,short margin,float *minp);

	/***************** 搜索极值点 ****************/
	// 搜索二维数组中前N个极值点,保存极值点坐标和对应值
	static void GetNMinisum(float ** p , int r, int c, int N , NPOT * q);
	static void GetNMaxisum(float ** p , int r, int c, int N , NPOT * q);

	// 搜索二维或一维数组中极值点,保存极值点坐标和对应值
	// 搜索面间隔step+1
	static NPOT GetMinisum(float ** p , int r, int c, int step=0);
	static NPOT GetMaxisum(float ** p , int r, int c, int step=0);
	static NPOT GetMinisum(float * p , int r, int c, int step=0);
	static NPOT GetMaxisum(float * p , int r, int c, int step=0);

	// 求二维数组中的极值
	static float GetMinisumValue(float ** p , int r, int c);
	static float GetMaxisumValue(float ** p , int r, int c);

	/***************** 随机点操作 ****************/
	// 输出随机点坐标到文件
	static void OutputPostData(COORDINATE * p, int n, CString txtfile);
	// 从文件中读取随机点坐标
	static COORDINATE * InputPostData(int* n, CString txtfile);
	// 在某框中等距产生随机点
	static COORDINATE * GenRandomPost( int &n, int x1, int x2, int y1, int y2, int step);

	/***************** 存储空间 ****************/
	static void *fspace_1d(int col,int length);
	static void **fspace_2d(int row,int col,int lenth);
	static void ***fspace_3d(int row1,int row2,int row3,int lenth);
	static void ffree_1d(void *a);
	static void ffree_2d(void **a,int row);
	static void ffree_3d(void ***a,int row1,int row2);

	/***************** 数组变维 ****************/
	// 将二维数组转换到一维数组
	static BYTE *  Trans2To1( BYTE ** p, CSize s);
	// 将一维数组转换到二维数组
	static BYTE ** Trans1To2( BYTE *  p, CSize s);

	/*************** 图象文件操作 **************/
	static FILE *wfwrite1(int row,int col,int type, CString filename);
	static FILE *wfread1(int *row,int *col,int *type, CString filename);
	// 输入PIC格式文件
	static unsigned char **InputImageWithName(int *Row,int *Col, CString FileName);
	// 输入PIC格式文件到一维数组
	static unsigned char *InputImageWithName_1d(int *Row,int *Col, CString FileName);
	// 输入PIC格式文件并返回图象数据到数组
	static unsigned char *InputImageWithName(CString FileName);
	// 输出PIC格式图象文件
	static BOOL OutputImageWithName(unsigned char **Image,int Row,int Col, CString FileName);
	static BOOL OutputImageWithName(unsigned char *Image,int Row, int Col, CString FileName);

	static BOOL InputImageWithName(IMAGE *p , CString FileName);
	static BOOL OutputImageWithName(IMAGE p , CString FileName);

	// 输入PIC格式文件并返回图象数据到数组
	static double *InputImageWithName_d(int *Row,int *Col, CString FileName);

	//////////////////
	// 输出RAW格式文件,输入参数包括图象行、列、文件头字节数
	static BOOL OutputImageDataWithName( void  **Image,int Row, int Col, CString FileName , int HeadBytes = 0 , int nPixelBytes = 1);
	// 输入RAW格式文件,输入参数包括图象行、列、文件头字节数
	static void **InputImageDataWithName(int Row,int Col, CString FileName , int HeadBytes = 0 , int nPixelBytes = 1);

	// 将PIC格式图象文件转换为BMP格式文件 8bit/p
	static BOOL TransPicToBmp(CString PicFileName, CString OutFileName, float fScale=1.0f, int x1=0, int x2=0, int y1=0, int y2=0, BOOL bPic = FALSE);
	static BOOL WriteAsBmp(BYTE ** image , int Row , int Col ,CString FileName);


	/*************** 图象大小估计 **************/
	static CSize GuessSize(int Len);
	static int GuessImageSizeWithName(int *Row,int *Col, CString FileName , BOOL bIsPic = FALSE);

	// 通过文件名判断文件类型
	static BOOL CheckFileType(CString file);
	// 对话框输入文件名
	static BOOL GetImageFileName(CString &file , CString title);

	// 图象序列间K-L变换滤波, n帧
	static void ImageFilterByK_L(CString filename , int n);

	// 图象按行K-L变换滤波, 共n帧
	static void ImageFilterByK_LRow(CString filename , int n);
	// 图象按列K-L变换滤波, 共n帧
	static void ImageFilterByK_LCol(CString filename , int n);
};

#endif // !defined(AFX_COMLIB_H__D54B1D06_0CE8_11D3_B159_204C4F4F5020__INCLUDED_)

⌨️ 快捷键说明

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