www.pudn.com > Imagepro_4.rar > Dib.h


// Dib.h: interface for the CDib class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_DIB_H__50ACB9D7_2CA7_4ED2_8498_7EDA4E2D7CC3__INCLUDED_) 
#define AFX_DIB_H__50ACB9D7_2CA7_4ED2_8498_7EDA4E2D7CC3__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
#define HDIB  HANDLE  
#define RADIUS  12 
#define m_HEIGHT 600 
#define m_WIDTH 600 
#define MINNUM		1e-8			//最小小数 
#define MAXNUM		1e+8			//最大整数 
 
#define	MASKDX		256				//掩膜X方向最大列数 
#define	MASKDY		256				//掩膜Y方向最大行数 
 
#define	BACKGROUND	0				//背景颜色 
#define	FOREGROUND	255				//前景颜色 
#define EDGECOLOR   255				//边缘颜色 
#define PI			3.1415926535 
#define MAXCHAIN	50 
#define Ng			256 
#define RECTWIDTH(x) (x->right-x->left) 
#define RECTHEIGHT(x) (x->bottom-x->top) 
#define THRESHOLDCONTRAST  40 
#define WIDTHBYTES(bits)  ((bits+31)/32*4) 
 
typedef struct 
{ 
	int cols; 
	int rows; 
	float kern[MASKDY][MASKDX]; 
}MASK;				 
 
class CDib   
{ 
public: 
	CDib(); 
	virtual ~CDib(); 
	CString m_strFileName;			//图象路径 
	long	m_dwWidth,m_dwHeight;	//图象宽、高 
	long    m_dwLine;				//图象每扫描行的字节数 
	long	m_dwDataSize;			//实际图象数据大小 
	int		m_iBitCount;			//图象的位数 
	int		more;					//图象扫描行补位 
	float scale ; 
	int width; 
	int height; 
	BITMAPINFOHEADER *m_pBIH;		//位图文件信息头 
	BITMAPFILEHEADER m_pBFH; 
	BOOL   bLoadHistab ; 
	BOOL      CompareImg2(HANDLE hDIBBK,HANDLE hDIBCurrent,CPoint pt1,CPoint pt2); 
	unsigned char * m_pDib;			//图像数据,包括BITMAPINFOHEADER,调色板和图像数据			 
	unsigned char * m_pDibBits;		//实际图象数据 
	unsigned char * m_pTempBits;	//用于存储暂时图象数据 
	unsigned char * m_pSourceBits;	//用于存储原始数据 
	BYTE* B_m_pTenpBits; 
	int histab[4][256];				//直方图数据	0 rgb 1 red 2 green 3 blue  
	float probability[256];	 
	RGBQUAD *m_pPalette;			//调色板数据 
	int m_nPaletteEntries; 
	 
	BOOL LoadBMPFile(const char* BmpFilename); 
	BOOL CopyRect(LPCRECT lpRectSource, LPCRECT lpRectGoal,	//源、目标区域坐标 
		long srcLine=0,long destLine=0,						//源、目标扫描行字节数		 
		unsigned char* srcimg=NULL,unsigned char* destimg=NULL,//源、目标数据存储地址 
		BOOL bCut=false);	 
	BOOL Load( const char * );										//打开图象文件 
	BOOL Save( const char * );										//保存图象文件 
	BOOL Draw( CDC *, int nX = 0, int nY = 0,int nWidth = -1,int nHeight = -1 );	//显示图象 
	 
	BOOL SetPalette( CDC * );	 //设置调色板 
	BOOL ShowImage(CDC* pDC,BOOL UnLoaded,CString pathname=""); 
	BOOL BeginStunt();	 
	void img_convolve(unsigned char* srcimg,long dx,long dy,MASK* msk,unsigned char* destimg,BOOL bEmboss = FALSE);	//模板匹配 
	void Sobel_Edge(unsigned char *srcimg, long dx, long dy, unsigned char *destimg); 
	void Laplacian_filter8(unsigned char * srcimg,long dx,long dy,unsigned char* destimg);//拉普拉斯算子边缘检测 
	void Laplacian_filter4(unsigned char * srcimg,long dx,long dy,unsigned char* destimg);//拉普拉斯算子边缘检测 
	void Roberts_Edge(unsigned char *srcimg, long nWidth, long nHeight, unsigned char *destimg); 
    void Prewitt1(unsigned char *srcimg, long dx, long dy, unsigned char *destimg) ; 
   // void Prewitt2(unsigned char *srcimg, long dx, long dy, unsigned char *destimg) ; 
	void Prewitt8(unsigned char *srcimg, long dx, long dy, unsigned char *destimg) ; 
	BOOL GetHistab(long imgwidth,long imgheight,int iBitcount,unsigned char* img=NULL); 
	//threashing 
	int  MESM(float p[256]);											//最大熵和法	 
	int entropy_thresh_sel1(float* prob);								//基于熵的阈值选取 
	int entropy_thresh_sel2(float* prob); 
	int moment_shresh_sel1(float* prob);							//基于矩的阈值选取 
	int moment_shresh_sel2(float* prob);							 
	BOOL Binarization(int threshold,int BitCount,unsigned char* img=NULL); 
	int global_entropy_shresh_sel(float* prob); 
	int min_cross_entropy_shresh_sel(float* prob); 
	int gradient_mean_shresh_sel(float* prob); 
	int moment_preserve_shresh_sel(float* prob); 
	int concavity_shresh_sel(float* prob); 
	void Krisch(unsigned char *srcimg, long dx, long dy, unsigned char *destimg);  
    void Krisch2(unsigned char *srcimg, long dx, long dy, unsigned char *destimg) ; 
	 void Roberts2(unsigned char *srcimg, long dx, long dy, unsigned char *destimg) ; 
	void Sub(unsigned char *srcimg,  unsigned char *destimg); 
   	HDIB  ToGray(HANDLE hDIB) ; 
	int       MedianSearch(int a[9][3],int n,int *r,int *g,int *b); 
	void	  DoMedianFilterDIB(int *r,int *g,int*b,WORD i,WORD j,WORD wBytesPerLine,LPBYTE lpDIBBits); 
	void	  MedianFilterDIB(HANDLE hDIB); 
	HANDLE    Gradient(HANDLE hDIB); 
	long	  PixelOffset(int i,int j,WORD wBytePerLine); 
	void      LocateImporntPoint(HANDLE hDIB, int Radius, CPoint *pPoint); 
	LPBYTE    FindDIBBits(HANDLE hDIB); 
    WORD      BytePerLine(HANDLE hDIB); 
	BOOL      ComPareImg(HANDLE hDIB1, HANDLE hDIB2 ,CPoint pt1,CPoint pt2); 
    BOOL      MatchImportantPoint(HANDLE hDIB,int CharaterInfo[RADIUS*2+1][RADIUS*2+1][3],CPoint *ImPoint); 
	HDIB   LoadDIB(LPCTSTR lpFileName); 
	HDIB   ReadDIBFile(HANDLE hFile); 
	BOOL   PaintDIBTrue(HDC hDC,LPRECT lpDCRect,HANDLE hDIB,LPRECT lpDIBRect ,DWORD dwRop); 
private: 
	CPalette m_Palette;				//调色板信息 
	 
	BOOL  bIsBinary;				//是否已经为二值图像 
	CString GetAppPath(); 
 
}; 
 
#endif // !defined(AFX_DIB_H__50ACB9D7_2CA7_4ED2_8498_7EDA4E2D7CC3__INCLUDED_)