📄 imageproc.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 + -