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_)