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

📄 imageproc.h

📁 面向软件工程的Visual C++网络程序开发
💻 H
字号:
// ======= File : ImageProc.h ======
#ifndef IMAGEPROC_H
#define IMAGEPROC_H

#include "afxtempl.h"
#include "Common.h"
#include "FreqTrans.h"
#include "DibApiHead.h"
#include "DibApi.h"
#include "Complex.h"
#include "Array2dHead.h"
#define PI 3.1415926535
//////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
#define KERNELCOLS			3
#define KERNELROWS			3
#define KERNELELEMENTS		(KERNELCOLS * KERNELROWS)

typedef struct tagKERNEL{
	int Elements[KERNELELEMENTS];
	int Divisor;
}KERNEL;
typedef KERNEL   *PKERNEL;
typedef KERNEL   *LPKERNEL;

///////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////

class AFX_EXT_CLASS CImageProc 
{
public:
	CImageProc() {}
	~CImageProc(){}
	BOOL	ImageGetImage(HDIB hDib, CRect& rect, IMAGE& img);
	BOOL	ImagePutImage(HDIB hDib, CRect& rect, IMAGE& img);  ///// For gray image
	BOOL	ImageGetImage(HDIB hDib, CRect& rect, IMAGE& r, IMAGE& g, IMAGE& b);
	BOOL	ImagePutImage(HDIB hDib, CRect& rect, IMAGE& r, IMAGE& g, IMAGE& b);
//	BOOL	ImageGetImage(HDIB hDib, CRect& rect, COLORIMAGE& ci);
//	BOOL	ImagePutImage(HDIB hDib, CRect& rect, COLORIMAGE& ci);


	HDIB	CreateDIBFromIMAGE(IMAGE& img, HANDLE hLogPal);

	void	ImageHisto(IMAGE& img, long* histo);

	void	ImageConvert(IMAGE& in, IMAGE& out, BYTE* ConvertCurve);
/*
	将图象数组a中的图象按一维数组ConvertCurve给定的数值转换到b中,要求
	ConvertCurve的长度为256,其数值范围与灰度值一样,在0和255之间。
	变换的算法为:
			b[j][i]=ConvertCurve[a[j][i]];
*/

	void	ImageClear(IMAGE& img, BYTE color = 0);

	void	ImageCopy(IMAGE& in, IMAGE& out);

	void	ImageLimit(IMAGE& img, UCHAR& Max, UCHAR& Min);

	void	ImageConvolute(IMAGE& img, int* Algo, int len, 
					int Div, CShortArr& sa);

	void	ImageShToIMAGE(CShortArr& sa, IMAGE& img);

	void	ImageInvert(IMAGE& in, IMAGE& out);
	void	ImageNeibAverage(IMAGE& in, IMAGE& out, int mode = 1);
				// 邻域平均 mode : 模板大小 1--3*3, 2--5*5,... ,7--15*15;
	void	ImageMedian(IMAGE& in, IMAGE& out, int mode = 1);
				// 中值平均 mode : 同上
	void	ImageHistoEqu(IMAGE& in, IMAGE& out);
	void	ImageLineTrans(IMAGE& in, IMAGE& out, UCHAR low, UCHAR high);
	void	ImageFlipHorz(IMAGE& in, IMAGE& out);
	void	ImageFlipVert(IMAGE& in, IMAGE& out);
	void	ImageTranslate(IMAGE& in, IMAGE& out, int dx, int dy);
	void	ImageRotate(IMAGE& in, IMAGE& out, double cx, double cy, double angle);

// : Image Enhancement
	void	ImageLowPass(IMAGE& in, IMAGE& out, int nAlgorithm);
	void	ImageHighPass(IMAGE& in, IMAGE& out, int nAlgorithm);

	void	ImageEdgeEnhance(IMAGE& in, IMAGE& out, int nAlgorithm);
	void	ImageSobelEdgeEnhance(IMAGE& in, IMAGE& out, int nAlgorithm);
	void	ImageHoughEdgeEnhance(IMAGE& in, IMAGE& out, int nAlgorithm);

	void	ImageSobelx(IMAGE& img, CShortArr& sa);
	void	ImageSobely(IMAGE& img, CShortArr& sa);
	void	ImageSobel(IMAGE& in, IMAGE& out);

	void	ImageHoughx(IMAGE& img, CShortArr& sa);
	void	ImageHoughy(IMAGE& img, CShortArr& sa);
	void	ImageHough(IMAGE& in, IMAGE& out);


public:
//数学形态学
	// 二值形态学
	void	ImageErosion(IMAGE& in, IMAGE& out, UCHAR* T, int mode = 1,
					UCHAR obj = 255, UCHAR bak = 0);
	void	ImageErosion(IMAGE& in, IMAGE& out);

	void	ImageDilation(IMAGE& in, IMAGE& out, UCHAR* T, int mode = 1,
					UCHAR obj = 255, UCHAR bak = 0);
	void	ImageDilation(IMAGE& in, IMAGE& out);

	void	ImageOpen(IMAGE& in, IMAGE& out, UCHAR* T, int mode=1,
					  UCHAR obj = 255, UCHAR bak = 0);
	void	ImageOpen(IMAGE& in, IMAGE& out);

	void	ImageClose(IMAGE& in, IMAGE& out, UCHAR* T, int mode = 1,
					   UCHAR obj = 255, UCHAR bak = 0);
	void	ImageClose(IMAGE& in, IMAGE& out);

	void	ImageAND(IMAGE& in1, IMAGE& in2, IMAGE& out,
						UCHAR obj = 255, UCHAR bak = 0);
	void	ImageOR( IMAGE& in1, IMAGE& in2, IMAGE& out,
						UCHAR obj = 255, UCHAR bak = 0);
	void	ImageXOR(IMAGE& in1, IMAGE& in2, IMAGE& out, 
						UCHAR obj = 255, UCHAR bak = 0);
	void	ImageSOR(IMAGE& in1, IMAGE& in2, IMAGE& out,
						UCHAR obj = 255, UCHAR bak = 0);

	void	ImageTableThin(IMAGE& in, IMAGE& out, 
						UCHAR obj = 255, UCHAR bak = 0);

	void	ImageHmtThin(IMAGE& in, IMAGE& out, 
						 UCHAR obj = 255, UCHAR bak = 0);

	void	ImageMaintainThin(IMAGE& in, IMAGE& out, 
						UCHAR obj = 255, UCHAR bak = 0);
private:
	void	Erosion(IMAGE& in,IMAGE& out,
						int Mask[9][2], int MaskLength,
						int obj = 255, int bak = 0);
public:
	void	hmt(IMAGE& in,IMAGE& out,
						int hMask[9][2], int hMaskLength,
						int mMask[9][2], int mMaskLength,
						int obj = 255, int bak = 0);
	void	hmtM(IMAGE& in,IMAGE& out,
						int hMask[9][2],int hMaskLength,
						int mMask[9][2],int mMaskLength,
						int obj = 255,int bak = 0);
//////////
	int		ImageCenter(IMAGE& in, double& ptx, double& pty, int obj = 255, int bak = 0);
	int		ImageBorder(IMAGE& in, IMAGE& out, int obj=255, int bak=0);
	
	// 灰度形态学
	void	ImageGrayErosion(IMAGE& in, IMAGE& out, 
						UCHAR* T, int mode = 1);
	void	ImageGrayErosion(IMAGE& in, IMAGE& out);

	void	ImageGrayDilation(IMAGE& in, IMAGE& out, 
						UCHAR* T, int mode = 1);
	void	ImageGrayDilation(IMAGE& in, IMAGE& out);

	void	ImageGrayOpen(IMAGE& in, IMAGE& out, 
						UCHAR* T, int mode = 1);
	void	ImageGrayOpen(IMAGE& in, IMAGE& out);

	void	ImageGrayClose(IMAGE& in, IMAGE& out, 
						UCHAR* T, int mode = 1);
	void	ImageGrayClose(IMAGE& in, IMAGE& out);

	void	ImageTopHat(IMAGE& in, IMAGE& out, 
						UCHAR* T, int mode = 1);
	void	ImageTopHat(IMAGE& in, IMAGE& out);

// FFT, IFFT, DCT, IDCT, WAVLET, IWAVELET... 
	void	ImageFFT(IMAGE& img, CFreqArr& freq);
	void	ImageFreqMod(IMAGE& img, CFreqArr& freq);
	void	ImageInvFFT(IMAGE& img, CFreqArr& freq);

	void	ImageWavelet(IMAGE& in, IMAGE& out, int DD);
	void	ImageInvWavelet(IMAGE& in, IMAGE& out, int DD);
private:
	int		a(int x, int xSize);
	int		s(double x);
	int		FToUch(double x);
	void	coef(double* h, double* g, double* hi, double* gi, int DD);
public:

//  : ImageSegment
	void	ImageSingleSegment(IMAGE& in, IMAGE& out, UCHAR Threshold, 
						UCHAR obj=255, UCHAR bak=0 );
	void	ImageSingleSegment(IMAGE& inR, IMAGE& inG, IMAGE& inB, IMAGE& out, 
								UCHAR thR, UCHAR thG, UCHAR thB,  
								UCHAR obj=255, UCHAR bak = 0);
	void	ImageMultiSegment(IMAGE& in, IMAGE& out, BYTE* pTh, int nThNum);

	int		ImagePtileSegment(IMAGE& img, float t);
	int		ImageDaJinSegment(IMAGE& img );
	BOOL	ImageIs2Mode(IMAGE& img, long* Histo);

	UCHAR	ImageFuzzy(long* Histo, long* Yita);
	UCHAR	ImageFuzzy(IMAGE& img, long*Yita);
	void	ImageFuzzySegment(IMAGE& in, IMAGE& out, 
						UCHAR obj = 255, UCHAR bak = 0);
	void	ImageFuzzySegment(IMAGE& inR, IMAGE& inG, IMAGE& inB, IMAGE& out,
							  UCHAR obj = 255, UCHAR bak = 0);
	void	ImageBlockSegment( IMAGE& in, IMAGE& out, int BlockSize,
						UCHAR obj = 255, UCHAR bak = 0);
	void	ImageBlockLineInterplation(IMAGE& in, IMAGE& out, int BlockSize,
						UCHAR obj=255, UCHAR bak=0);
//////////////////////////////////////////
	//  灰度聚类 -- Unsupervised gray image cluster
	int		Cluster(long* pSample, long nSample, BYTE* pClass, long* pSmpCtr, 
							long nSmpCtr, long nError);        
	int		ImageCluster(IMAGE& img, IMAGE& outClass, BOOL bInitial, 
							IMAGE& SmpCtr, long nError);
					//pSmpCtr : Original clustering center and final clustering center returned
	int		FuzzyCluster(long* pSample, long nSample, double* pU, 
							long*pSmpCtr, long nSmpCtr, long nError);
	int		ImageFuzzyCluster(IMAGE&img, IMAGE& outClass, int nClassNum, 
							BOOL bInitial, long*pSmpCtr, long nError);
	int		SvFuzzyCluster(long* pSample, long nSample, double*pU, 
							long* pSmpCtr, long nSmpCtr);
	

	//  特征聚类
	void	CIToVector(IMAGE& r, IMAGE& g, IMAGE& b, IMAGE& baVector);
	void	TransPosition(IMAGE& baPre, IMAGE& baPro) ;    /// 矩阵转置
	int		Cluster(BYTE* pSample, int nDim, long nSample, BYTE* pClass, 
							BYTE* pSmpCtr, long nSmpCtr, long nError);
				// pSample -- 样本指针,指向一个多维矢量集
				// nDim    -- 矢量维度
				// nSample -- 样本数量
				// pClass  -- 返回的每个样本的类别
				// pSmpCtr -- 初始的与返回的聚类中心
				// nSmpCtr -- 聚类中心的个数
				// nError  -- 聚类迭代过程结束的条件,前后类中心的矢量距离之差
	int		ImageCluster(IMAGE& r, IMAGE& g, IMAGE& b, IMAGE& outClass, 
							BOOL bInitial, IMAGE& SmpCtr, long nError) ;
	int		FuzzyCluster(BYTE* pSample, int nDim, long nSample, double* pU, 
							BYTE* pSmpCtr, long nSmpCtr, long nError) ;
				// pSample -- 指向一 nDim * nSample 的2维矩阵
				// pU      -- 指向一 nSmpCtr * nSample 的2维矩阵
	int		SvFuzzyCluster(BYTE* pSample, int nDim, long nSample, double*pU, 
							BYTE* pSmpCtr, long nSmpCtr);

	int		Defuzzy(double* pU, int nSmpCtr, int nWidth, int nHeight, int nLayer, BYTE* pClass);

};

///////////////////////////////////////////////////////////////////////////

#endif

⌨️ 快捷键说明

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