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

📄 mschannel.c

📁 image processing including fourier,wavelet,segmentation etc.
💻 C
字号:
/*----------------------Megawave2 Module-----------------------------------*//*mwcommand  name = {mschannel};  version = {"1.3"};  author = {"Yann Guyonvarc'h"};   function = {"Build a multi-scales multi-channels decomposition of an image"};  usage = {'N':[N=1]->N      "# images per channel, default 1 (for local scale value)",'S':[S=1]->S      "standard deviation of the smoothing filter, default 1",'W':[W=1]->W      "pixel weight for the smoothing filter, default 1",'p':[p=2]->p[1,2] "scalar distance: ABS (p=1) or Quadratic (p=2,default)",in->in            "input Fimage",mov<-mov          "output Fmovie"};*//*---------------------------------------------------------------------- v1.2: call to fblur() -> fsepconvol() (L.Moisan) v1.3: main loop rewritten, bugs fixed, acceleration (L.Moisan)----------------------------------------------------------------------*/#include <stdio.h> #include <stdlib.h> #include <math.h>#include "mw.h"extern void fsepconvol();#define ABS(x)       ( (x)>0?(x):-(x) )Fimage add_image(nx,ny,prev,next)     int nx,ny;     Fimage *prev,**next;{  Fimage u;    u = mw_change_fimage(NULL,ny,nx);  if (!u) mwerror(FATAL,1,"Not enough memory\n");  u->previous = *prev;  **next = *prev = u;  *next = &(u->next);  return(u);}/*------------------------------ MAIN MODULE ------------------------------*/void mschannel(N,S,W,p,in,mov)     int    *N,*W,*S,*p;     Fimage in;     Fmovie mov;{  int      x,y,xl,xr,yl,yr,e,nx,ny,boundary=1;    Fimage   H,V,D,tmp,prev,*next;  float    a,b,c;  nx = in->ncol; ny = in->nrow;    mov = mw_change_fmovie(mov);  tmp = mw_change_fimage(in,ny,nx);  if (!mov || !tmp) mwerror(FATAL,1,"Not enough memory\n");    next = &(mov->first);  prev = NULL;  *N = abs(2*(*N)-1);  mw_copy_fimage(in,tmp);    for (e=1;e<=*N;e+=2) {    H = add_image(nx,ny,&prev,&next);    V = add_image(nx,ny,&prev,&next);    D = add_image(nx,ny,&prev,&next);    if (e!=1)      fsepconvol(tmp,tmp,NULL,NULL,&e,NULL,&boundary);          for (x=0;x<nx;x++)      for (y=0;y<ny;y++) {	a = tmp->gray[y*nx+x];	xl = (x>=e?x-e:0); xr = (x+e<nx?x+e:nx-1);	yl = (y>=e?y-e:0); yr = (y+e<ny?y+e:ny-1);	/* Horizontal channel */	b = tmp->gray[y*nx+xl] - a;	c = tmp->gray[y*nx+xr] - a;	H->gray[y*nx+x] = 0.5*(*p==1?ABS(b)+ABS(c):b*b+c*c);	/* Vertical channel */	b = tmp->gray[yl*nx+x] - a;	c = tmp->gray[yr*nx+x] - a;	V->gray[y*nx+x] = 0.5*(*p==1?ABS(b)+ABS(c):b*b+c*c);	/* Diagonal channel */	b = tmp->gray[yl*nx+xl] - a;	c = tmp->gray[yr*nx+xr] - a;	D->gray[y*nx+x] = 0.5*(*p==1?ABS(b)+ABS(c):b*b+c*c);      }        fsmooth(S,W,H,H);    fsmooth(S,W,V,V);    fsmooth(S,W,D,D);  }    *next=NULL;}

⌨️ 快捷键说明

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