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

📄 fftgrad.c

📁 image processing including fourier,wavelet,segmentation etc.
💻 C
字号:
/*--------------------------- MegaWave2 module -----------------------------*//* mwcommand  name = {fftgrad};  version = {"1.1"};  author = {"Lionel Moisan"};  function = {"Compute the gradient of an image using Fourier interpolation"};  usage = {'x':gradx<-gradx       "gradient (x coordinate)",'y':grady<-grady       "gradient (y coordinate)",'n':gradn<-gradn       "gradient norm |Du|",'p':gradp<-gradp       "gradient phase (degrees) in [-180,180] U {mw_not_an_argument (=1.0e9)}",in->in                 "input Fimage"  };*//*---------------------------------------------------------------------- v1.1: bug fixed (missing computation for -n option) (L.Moisan)----------------------------------------------------------------------*/#include <stdio.h>#include <math.h>#include "mw.h"#define RADIANS_TO_DEGREES (180.0/M_PI)void fftgrad(in,gradx,grady,gradn,gradp)Fimage in,gradx,grady,gradn,gradp;{  int nx,ny,x,y,adr;  float normx,normy,cx,cy,xx,yy;  Fimage re,im;  nx = in->ncol;  ny = in->nrow;  gradx = mw_change_fimage(gradx,ny,nx);  if (!gradx) mwerror(FATAL,1,"Not enough Memory.\n");  else mw_clear_fimage(gradx,0.0);  grady = mw_change_fimage(grady,ny,nx);  if (!grady) mwerror(FATAL,1,"Not enough Memory.\n");  else mw_clear_fimage(grady,0.0);    if (gradn)     if (!mw_change_fimage(gradn,ny,nx))      mwerror(FATAL,1,"Not enough Memory.\n");    else mw_clear_fimage(gradn,0.0);  if (gradp)     if (!mw_change_fimage(gradp,ny,nx))      mwerror(FATAL,1,"Not enough Memory.\n");    else mw_clear_fimage(gradp,mw_not_an_argument);  normx = 2.0*M_PI/(float)(nx);  normy = 2.0*M_PI/(float)(ny);  re = mw_new_fimage();  im = mw_new_fimage();  /* Fourier transform */  fft2d(in,NULL,re,im,0);  /*** MAIN LOOP ***/  for (x=0;x<nx;x++)    for (y=0;y<ny;y++) {      adr = y*nx+x;      cx = re->gray[adr];      cy = im->gray[adr];      xx = normx * (float)(x>nx/2?x-nx:x);      yy = normy * (float)(y>ny/2?y-ny:y);      if (x==nx/2) xx=0.0;      if (y==ny/2) yy=0.0;      re->gray[adr] =  yy * cx + xx * cy;      im->gray[adr] = -xx * cx + yy * cy;    }  /* inverse Fourier transform */  fft2d(re,im,gradx,grady,1);    if (gradp)    for (adr=nx*ny;adr--;)      if (gradx->gray[adr]!=0.0 || grady->gray[adr]!=0.0)	  gradp->gray[adr] = RADIANS_TO_DEGREES *	    (float)atan2( (double)grady->gray[adr],			  (double)gradx->gray[adr]);  if (gradn)    for (adr=nx*ny;adr--;)      if (gradx->gray[adr]!=0.0 || grady->gray[adr]!=0.0)	gradn->gray[adr] = 	  (float)hypot( (double)grady->gray[adr],			(double)gradx->gray[adr]);  mw_delete_fimage(re);  mw_delete_fimage(im);}

⌨️ 快捷键说明

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