中国高校课件下载中心 》 教学资源 》 大学文库

《数字图像处理技术》课程教学资源(实例)实验 - C语言附录实例

文档信息
资源类别:文库
文档格式:DOC
文档页数:131
文件大小:707.5KB
团购合买:点击进入团购
内容简介
附录一、快速付里哀变换与反变换程序实例 附录二、快速余弦变换与反变换程序实例 附录三、快速 Walsh-Hadamard 变换与反变换程序实例 附录四、二维小波分解与重构程序实例 附录五、直方图均衡处理程序实例 附录六、伪彩色增强处理程序实例 附录七、模糊图像恢复处理程序实例 附录八、中值和均值滤波图像恢复处理程序实例 附录九、数学形态学处理程序实例 附录十、图像采集卡的参数及使用(供光盘中软件参考)
刷新页面文档预览

附录快速付里哀变换与反变换程序实例目 #include #include #define pi (double)3.14159265359 /*复数定义*/ typedef struct doublere double im; COMPLEX: /朱复数加运算/ COMPLEX Add(COMPLEX c1,COMPLEX c2) COMPLEX c: c.re=cl.re+c2.re: c.im-c1.im+c2.im; return c: /朱复数减运算*/ COMPLEX Sub (COMPLEX c1,COMPLEX c2) COMPLEX c: c.re=cl.re-c2.re; c.im=c1.im-c2.im: return c: /*复数乘运算* COMPLEX Mul(COMPLEX c1,COMPLEX c2) COMPLEX c: return c: /余快速付里哀变换

附录一、快速付里哀变换与反变换程序实例 #include #include #define pi (double)3.14159265359 /*复数定义*/ typedef struct { double re; double im; }COMPLEX; /*复数加运算*/ COMPLEX Add(COMPLEX c1, COMPLEX c2) { COMPLEX c; c.re=c1.re+c2.re; c.im=c1.im+c2.im; return c; } /*复数减运算*/ COMPLEX Sub(COMPLEX c1, COMPLEX c2) { COMPLEX c; c.re=c1.re-c2.re; c.im=c1.im-c2.im; return c; } /*复数乘运算*/ COMPLEX Mul(COMPLEX c1, COMPLEX c2) { COMPLEX c; c.re=c1.re*c2.re-c1.im*c2.im; c.im=c1.re*c2.im+c2.re*c1.im; return c; } /*快速付里哀变换

TD为时域值,FD为频域值,power为2的幂数*/ void FFT(COMPLEX*TD,COMPLEX FD,int power) int count; int i,j,k,bfsize,p: double angle: COMPLEXW*X1,*X2,*X /计算付里哀变换点数*/ count=1《<power: /*分配运算所需存储器* W=(COMPLEX *)malloc (sizeof (COMPLEX)*count/2) x1-(COMPLEX)mal(izof(COMPLEX)t) OMPLEX)malloc(sizeof(COMPLEX)*count) /计算加权系数* for(i=0:i<count/2:i++) W[i].im=sin(angle): /将时域点写入存储器*/ of(C)) for(k-0:k<power:k++) for(j=0:j<1<<k;j++) bfsize=1<<powe -k; for(i-0:i<bfsize/2:i++) D=i#bfsize: X2[i+p]=Add(X1[i+p],X1[i+p+bfsize/2]): X2[i+p+bfsize/2]=Mul(Sub(X1[i+p],.X1[i+p+bfsize/2]),W[i*(1<<k)]): X=X1: X1=X2 X2=X: /*重新排序*/ for(j=0:j<count:j++)

TD 为时域值,FD 为频域值,power 为 2 的幂数*/ void FFT(COMPLEX * TD, COMPLEX * FD, int power) { int count; int i,j,k,bfsize,p; double angle; COMPLEX *W,*X1,*X2,*X; /*计算付里哀变换点数*/ count=1<<power; /*分配运算所需存储器*/ W=(COMPLEX *)malloc(sizeof(COMPLEX)*count/2); X1=(COMPLEX *)malloc(sizeof(COMPLEX)*count); X2=(COMPLEX *)malloc(sizeof(COMPLEX)*count); /*计算加权系数*/ for(i=0;i<count/2;i++) { angle=-i*pi*2/count; W[i].re=cos(angle); W[i].im=sin(angle); } /*将时域点写入存储器*/ memcpy(X1,TD,sizeof(COMPLEX)*count); /*蝶形运算*/ for(k=0;k<power;k++) { for(j=0;j<1<<k;j++) { bfsize=1<<power-k; for(i=0;i<bfsize/2;i++) { p=j*bfsize; X2[i+p]=Add(X1[i+p],X1[i+p+bfsize/2]); X2[i+p+bfsize/2]=Mul(Sub(X1[i+p],X1[i+p+bfsize/2]),W[i*(1<<k)]); } } X=X1; X1=X2; X2=X; } /*重新排序*/ for(j=0;j<count;j++) {

n=0 for(i-0:i<power:i++) if (j&(1<<i))p+=1<<power-i-1; FD[]=X1[p]: /释放存储器* free(W) free(X1): free(X2): /*快速付里哀反变换,利用快速付里哀变换 FD为频域值,TD为时域值,power为2的幂数*/ void IFFT(COMPLEX *FD,COMPLEX *TD,int power) int i,count; /计算付里哀反变换点数*/ count=1<<power: *分配云算所需存储婴* x=(COMPLEX)malloc(siz eof(COMPLEX)*count) /将频域点写入存储器* memcpy (x,FD,sizeof (COMPLEX)*count): /求频域点的共轭*/ for(i=0:i(count:i+ x[i].im-x[i].im: /*调用快速付里哀变换*/ FFT(x.TD.power): /条求时域点的共轭/ for(i-0:i<cot:i+) TD[i].re/=count; TD[i],in-TD[i].im/count /*释放存储器* free(x): 附录二快速余弦变换与反变换程序实似

p=0; for(i=0;i<power;i++) { if (j&(1<<i)) p+=1<<power-i-1; } FD[j]=X1[p]; } /*释放存储器*/ free(W); free(X1); free(X2); } /*快速付里哀反变换,利用快速付里哀变换 FD 为频域值,TD 为时域值,power 为 2 的幂数*/ void IFFT(COMPLEX *FD, COMPLEX *TD, int power) { int i,count; COMPLEX *x; /*计算付里哀反变换点数*/ count=1<<power; /*分配运算所需存储器*/ x=(COMPLEX *)malloc(sizeof(COMPLEX)*count); /*将频域点写入存储器*/ memcpy(x,FD,sizeof(COMPLEX)*count); /*求频域点的共轭*/ for(i=0;i<count;i++) { x[i].im=-x[i].im; } /*调用快速付里哀变换*/ FFT(x,TD,power); /*求时域点的共轭*/ for(i=0;i<count;i++) { TD[i].re/=count; TD[i].im=-TD[i].im/count; } /*释放存储器*/ free(x); } 附录二、快速余弦变换与反变换程序实例

(利用2N点付里哀变换实现快速余弦变换) /快速离散余弦变换,利用快速付里哀变换 f为时域值,F为变换域值,power为2的幂数*/ void DCT(double *f,double #F,int power) int i count: COMPLEX *X: double s /计算离散余弦变换点数*/ count=1<<power: /分配运算所需存储器* X=(COMPLEX *)malloc(sizeof(COMPLEX)*count*2) /*延拓*/ memset (X,0,sizeof (COMPLEX)*count*2) /将时域点写入存储器* for(i=0:i<count:i++) x[i】.re=f[i] /调用快速付里哀变换* FFT(X,X,power+1): /*调整系数*/ s=1/sqrt count) F[O]=X[O]. re*s s*=sqrt(2) for(i=1:i<count:i++) F[i]=(仅[i].re*cos(i和i/(count*2)+X[i.i*sin(ipi/(counta*2)*s /体释放存储器*/ free): /快速离散余弦反变换,利用快速付里哀反变换 F为变换域值,f为时域值,poer为2的幂数* void IDCT(double *F,double *f,int power) int i count. COMPLEX *X: /计算离散余弦反变换点数*/ count=1<<power:

(利用 2N 点付里哀变换实现快速余弦变换) /*快速离散余弦变换,利用快速付里哀变换 f 为时域值,F 为变换域值,power 为 2 的幂数*/ void DCT(double *f, double *F, int power) { int i,count; COMPLEX *X; double s; /*计算离散余弦变换点数*/ count=1<<power; /*分配运算所需存储器*/ X=(COMPLEX *)malloc(sizeof(COMPLEX)*count*2); /*延拓*/ memset(X,0,sizeof(COMPLEX)*count*2); /*将时域点写入存储器*/ for(i=0;i<count;i++) { X[i].re=f[i]; } /*调用快速付里哀变换*/ FFT(X,X,power+1); /*调整系数*/ s=1/sqrt(count); F[0]=X[0].re*s; s*=sqrt(2); for(i=1;i<count;i++) { F[i]=(X[i].re*cos(i*pi/(count*2))+X[i].im*sin(i*pi/(count*2)))*s; } /*释放存储器*/ free(X); } /*快速离散余弦反变换,利用快速付里哀反变换 F 为变换域值,f 为时域值,power 为 2 的幂数*/ void IDCT(double *F, double *f, int power) { int i,count; COMPLEX *X; double s; /*计算离散余弦反变换点数*/ count=1<<power;

/*分配运算所需存储器*/ X=(COMPLEX*)malloc(sizeof(COMPLEX)*count*2) /*延拓* memset(化,0,sizeof(C0 MPLEX)*counta*2) /*调整频域点并写入存储器*/ for(i=0:i<count:i++) X[i].re=F[i]*cos(i*pi/(count*2)) X[i】.im=F[i]*sin(iw柳i/(count*2) /*调用快速付里哀反变换*/ IFFT(X,X.power+1): /调整系数* s=1/sqrt(count); for(i=0:i<count:i+】 f[i]=(1-s0rt(2))*s*F[0]+s0rt(2)*s*X[i].re*count*2: /释放存储器* free(X): 附录三.快速Walsh-dm变换与反变换程序实例 /*快速沃尔什-哈达玛变换 f为时域值,F为变换域值,power为2的幂数*/ void WALh(double*f,double*,int power) int count int i,j,k,bfsize,p: doub1e1,*2,*: /计算快速沃尔什变换点数* count=1<<power /*分配运算所需存储器* X1=(double *)malloc(sizeof(double)*count): X2=(double *)malloc(sizeof(double)*count) *将时域点写入存储器*/ for(k=0;k<power:k++) for(=0:i(1(k:i++)】

/*分配运算所需存储器*/ X=(COMPLEX *)malloc(sizeof(COMPLEX)*count*2); /*延拓*/ memset(X,0,sizeof(COMPLEX)*count*2); /*调整频域点并写入存储器*/ for(i=0;i<count;i++) { X[i].re=F[i]*cos(i*pi/(count*2)); X[i].im=F[i]*sin(i*pi/(count*2)); } /*调用快速付里哀反变换*/ IFFT(X,X,power+1); /*调整系数*/ s=1/sqrt(count); for(i=0;i<count;i++) { f[i]=(1-sqrt(2))*s*F[0]+sqrt(2)*s*X[i].re*count*2; } /*释放存储器*/ free(X); } 附录三、快速 Walsh-Hadamard 变换与反变换程序实例 /*快速沃尔什-哈达玛变换 f 为时域值,F 为变换域值,power 为 2 的幂数*/ void WALh(double *f, double *W, int power) { int count; int i,j,k,bfsize,p; double *X1,*X2,*X; /*计算快速沃尔什变换点数*/ count=1<<power; /*分配运算所需存储器*/ X1=(double *)malloc(sizeof(double)*count); X2=(double *)malloc(sizeof(double)*count); /*将时域点写入存储器*/ memcpy(X1,f,sizeof(double)*count); /*蝶形运算*/ for(k=0;k<power;k++) { for(j=0;j<1<<k;j++)

bfsize=1

{ bfsize=1

#include #include #include #include #include #include #include〈string.h #include #include #include #include "stdio.h" #include "stdlib.h" #include "bmpview.h" #define PI 3.1415926 #define SIZE 256 #define DD 13 f1oath[DD]={-0.00332761,0.00569794.0.0196637,-0.0482603,-0.0485391, 0.292562,0.564406,0.292562,-0.0485391,-0.0482602,-0.0196637 0.00569794.-0.00332761· f1oatg[DD]=f0.00332761,0.00569794,-0.0196637,-0.0482603,0.0485391 0.292562,-0.564406,0.292562,0.0485391,-0.0482602,0.0196637, 0.00569794,0.0033276: float hi[DD],gi[DD]: int wavelet_direction=1; int a(int x,int xsize) //Threshold// int s(float x); //Set Inverse Filter Coefficients// oid coefo. /***avelet Transform********林/ void wt(int xs,int ys,long xsize,long ysize); //*****Inverse Wavelet Transform*****************// void iwt(int xs,int ys,long xsize,long ysize); float *img[SIZE],*imgx [SIZE],*imgy [SIZE] //**for evolution agents**// int AgentNum,ActiveAgent:

#include #include #include #include #include #include #include #include #include #include #include #include "stdio.h" #include "stdlib.h" #include "bmpview.h" #define PI 3.1415926 #define SIZE 256 #define DD 13 float h[DD]={-0.00332761,0.00569794,0.0196637,-0.0482603,-0.0485391, 0.292562,0.564406,0.292562,-0.0485391,-0.0482602,-0.0196637, 0.00569794,-0.0033276}; float g[DD]={0.00332761,0.00569794,-0.0196637,-0.0482603,0.0485391, 0.292562,-0.564406,0.292562,0.0485391,-0.0482602,0.0196637, 0.00569794,0.0033276}; float hi[DD],gi[DD]; int wavelet_direction=1; int a(int x,int xsize); //Threshold// int s(float x); //Set Inverse Filter Coefficients// void coef(); //********Wavelet Transform************************// void wt(int xs,int ys,long xsize,long ysize); //*****Inverse Wavelet Transform*********************// void iwt(int xs,int ys,long xsize,long ysize); float *img[SIZE],*imgx[SIZE],*imgy[SIZE]; //****for evolution agents*****// int AgentNum,ActiveAgent;

int SolutionX[1000],SolutionY[1000]: int SearchNum,AgentLife int Agent[0][2] int isAgentAlive[1000] int SearchTime; unsigned short Image[32][32]: #define MAXAPPNAME 20 static const char AppName[]="Image Processing"; /TBmpViewindow,a Bitmap displaying window derived from TClipboardViewer PIo)sopoqdT jo /an additional base was desired. class TSubWindow public TFrameWindow public: TSubWindow(TWindow*parent): TSubWindow O: protected: void EvSize(UINT sizeType,TSize&size) (Invalidate();TFrameWindow::EvSize(sizeType,size);} void Paint(TDC&dc,bool,TRect&): DECLARE RESPONSE TABLE(TSubWindow): DEFINE_RESPONSE_TABLE1(TSubWindow,TFrameWindow) EV_WM_SIZE, END RESPONSE TABLE: //pointers to different child windows TWindow*SubWinPtr 0: TSubWindow:TSubWindow(TWindow*parent) TFrameWindow(parent) Attr.Style | WS_VISIBLE I WS_POPUP WS_OVERLAPPEDWINDOW Attr.X 100; Attr.Y =100; Attr.W=300:

int SolutionX[1000],SolutionY[1000]; int SearchNum,AgentLife; int Agent[1000][2]; int isAgentAlive[1000]; int SearchTime; unsigned short Image[32][32]; #define MAXAPPNAME 20 static const char AppName[] = "Image Processing"; // // TBmpViewWindow, a Bitmap displaying window derived from TClipboardViewer to // facilitate receiving of clipboard change notifications. Could mix it in if // an additional base was desired. // class TSubWindow : public TFrameWindow { public: TSubWindow(TWindow* parent); ~TSubWindow(); protected: void EvSize(UINT sizeType, TSize& size) {Invalidate(); TFrameWindow::EvSize(sizeType, size);} void Paint(TDC& dc, bool, TRect&); DECLARE_RESPONSE_TABLE(TSubWindow); }; DEFINE_RESPONSE_TABLE1(TSubWindow, TFrameWindow) EV_WM_SIZE, END_RESPONSE_TABLE; // pointers to different child windows. // TWindow* SubWinPtr = 0; TSubWindow::TSubWindow(TWindow* parent) : TFrameWindow(parent) { Attr.Style |= WS_VISIBLE | WS_POPUP | WS_OVERLAPPEDWINDOW, Attr.X = 100; Attr.Y = 100; Attr.W = 300;

Attr.H=400: /Destroy window.SubWinPtr[Type]is set to 0 to indicate that the window /has be closed. TSubWindow::TSubWindowO SubWinPtr 0: void TSubWindow::Paint(TDC&de,bool,TRect&) class TBmpViewWindow:virtual public TWindow,public TClipboardViewer( public char FileName [MAXPATH] TDib* Dib: TBitmap*Bitmap: TMemoryDC pMemDC: TBrush* BkgndBrush: long ROp: int PixelWidth: int PixelHeight: WORD Colors Fit: bool AutoClipView: /unsigned char far *f[256],*g[256]: void ShowSubWindow(TWindow*parent): protected: void CmFileOpen(): void CmCopy(); CmPasteO: CmFit(); void CmAutoClipview(): void CeCopy(TCommandEnabler&ce): void CePaste(TCommandEnabler&ce):

Attr.H = 400; } // // Destroy window. SubWinPtr[Type] is set to 0 to indicate that the window // has be closed. // TSubWindow::~TSubWindow() { SubWinPtr = 0; } void TSubWindow::Paint(TDC& dc, bool, TRect&) { } class TBmpViewWindow : virtual public TWindow, public TClipboardViewer { public: char FileName[MAXPATH]; TDib* Dib; TBitmap* Bitmap; TMemoryDC * pMemDC; TPalette* Palette; TBrush* BkgndBrush; long Rop; int PixelWidth; int PixelHeight; WORD Colors; bool Fit; bool AutoClipView; // unsigned char far *f[256],*g[256]; TBmpViewWindow(); ~TBmpViewWindow(); void ShowSubWindow(TWindow* parent); protected: void CmFileOpen(); void CmCopy(); void CmPaste(); void CmFit(); void CmAutoClipView(); void CeCopy(TCommandEnabler& ce); void CePaste(TCommandEnabler& ce);

void CeFit(TCommandEnabler&ce): oid CeAutoClipView(TCommandEnabler&ce) mage Processing void CmWavelet(): void CmAgent(): 厂/来率家率率球球球米率率球率球米球/ void Paint(TDC&,bool erase,TRect&): EvSiz izeType,TSize&) void EvPaletteChanged (HWND hWndPalChg): bool EvQueryNewPalette(): void EvSetFocus(HWND):/should use above when working EvDrawClipboard( EvDestroy ( bool UpdatePalette(bool alwaysRepaint): void AdjustScroller(): void bool LoadBitmapFile(const char*) bool LoadBitmapResource (WORD ResId) DECLARE RESPONSE TABLE(TBmpViewwindow) DEFINE_RESPONSE_TABLE2(TBmpViewWindow,TClipboardViewer,TWindow) EV_COMMAND(CM_FILEOPEN,CmFileOpen), EV COMMAND (CM EDITCOPY.CmCopy) EV COMMAND (CM EDITPASTE,CmPaste) EV_COMMAND(CM_FIT,CmFit) EV_COMMAND(CM_AUTOCLIPVIEW,CmAutoClipView), EV COMMAND ENABLE (CM EDITCOPY.CeCopy). EV_COMMAND_ENABLE(CM_EDITPASTE,CePaste), EV COMMAND ENABLE (CM FIT.Cefit). EV_COMMAND_ENABLE(CM_AUTOCLIPVIEW,CeAutoClipView) //家***冰Image Processing***********冰**// EV_COMMAND(CM_WAVELET,CmWavelet), EV COMMAND (CM AGENT.CmAgent). EV_WM_SIZE, EV_WM_PALETTECHANGED EV_WM_QUERYNEWPALETTE

void CeFit(TCommandEnabler& ce); void CeAutoClipView(TCommandEnabler& ce); //*** Image Processing**// void CmWavelet(); void CmAgent(); //**********************// void Paint(TDC&, bool erase, TRect&); void EvSize(UINT sizeType, TSize&); void EvPaletteChanged(HWND hWndPalChg); bool EvQueryNewPalette(); void EvSetFocus(HWND); // should use above when working void EvDrawClipboard(); void EvDestroy(); bool UpdatePalette(bool alwaysRepaint); void AdjustScroller(); void SetCaption(const char*); void SetupFromDib(TDib* dib); bool LoadBitmapFile(const char*); bool LoadBitmapResource(WORD ResId); DECLARE_RESPONSE_TABLE(TBmpViewWindow); }; DEFINE_RESPONSE_TABLE2(TBmpViewWindow, TClipboardViewer, TWindow) EV_COMMAND(CM_FILEOPEN, CmFileOpen), EV_COMMAND(CM_EDITCOPY, CmCopy), EV_COMMAND(CM_EDITPASTE, CmPaste), EV_COMMAND(CM_FIT, CmFit), EV_COMMAND(CM_AUTOCLIPVIEW, CmAutoClipView), EV_COMMAND_ENABLE(CM_EDITCOPY, CeCopy), EV_COMMAND_ENABLE(CM_EDITPASTE, CePaste), EV_COMMAND_ENABLE(CM_FIT, CeFit), EV_COMMAND_ENABLE(CM_AUTOCLIPVIEW, CeAutoClipView), //*****Image Processing***************// EV_COMMAND(CM_WAVELET,CmWavelet), EV_COMMAND(CM_AGENT,CmAgent), //***************************************// EV_WM_SIZE, EV_WM_PALETTECHANGED, EV_WM_QUERYNEWPALETTE

刷新页面下载完整文档
VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
相关文档