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

📄 处理..c

📁 matlab 例程
💻 C
📖 第 1 页 / 共 4 页
字号:
		g1 = norm (dx[i-1][j-1], dy[i-1][j-1]);
	      } else
	      {
		g3 = norm (dx[i+1][j-1], dy[i+1][j-1]);
		g1 = norm (dx[i-1][j+1], dy[i-1][j+1]);
	      }

	    } else
	    {

	      xx = fabs(yc)/fabs(xc);
	      yy = 1.0;

	      g2 = norm (dx[i][j+1], dy[i][j+1]);
	      g4 = norm (dx[i][j-1], dy[i][j-1]);
	      if (xc*yc > 0.0)
	      {
		g3 = norm (dx[i-1][j-1], dy[i-1][j-1]);
		g1 = norm (dx[i+1][j+1], dy[i+1][j+1]);
	      }
	      else
	      {
		g1 = norm (dx[i-1][j+1], dy[i-1][j+1]);
		g3 = norm (dx[i+1][j-1], dy[i+1][j-1]);
	      }
	    }

	    if ( (g > (xx*g1 + (yy-xx)*g2)) &&
		 (g > (xx*g3 + (yy-xx)*g4)) )
	    {
	      if (g*MAG_SCALE <= 255)
		list0[i][j] = (unsigned char)(g*MAG_SCALE);
	      else
		list0[i][j] = 255;
	      list2[i][j] = atan2 (yc, xc) *ORI_SCALE;
	    } else
	    {
		list0[i][j] = 0;
		list2[i][j] = 0;
	    }

	  }
	}
}

void seperable_convolution (struct IMAGE *image,BYTE **list1, int Dx,int Dy,float *gau, int width, 
		float **smx, float **smy)
{
	int i,j,k, I1, I2, nr, nc;
	float x, y;

	nr = Dx;
	nc = Dy;

	for (i=0; i<nr; i++)
	  for (j=0; j<nc; j++)
	  {
	    x = gau[0] * list1[i][j]; y = gau[0] * list1[i][j];
	    for (k=1; k<width; k++)
	    {
	      I1 = (i+k)%nr; I2 = (i-k+nr)%nr;
	      y += gau[k]*list1[I1][j] + gau[k]*list1[I2][j];
	      I1 = (j+k)%nc; I2 = (j-k+nc)%nc;
	      x += gau[k]*list1[i][I1] + gau[k]*list1[i][I2];
	    }
	    smx[i][j] = x; smy[i][j] = y;
	  }
}
void dxy_seperable_convolution (float** im, int nr, int nc,  float *gau, 
		int width, float **sm, int which)
{
	int i,j,k, I1, I2;
	float x;

	for (i=0; i<nr; i++)
	  for (j=0; j<nc; j++)
	  {
	    x = 0.0;
	    for (k=1; k<width; k++)
	    {
	      if (which == 0)
	      {
		I1 = (i+k)%nr; I2 = (i-k+nr)%nr;
		x += -gau[k]*im[I1][j] + gau[k]*im[I2][j];
	      }
	      else
	      {
		I1 = (j+k)%nc; I2 = (j-k+nc)%nc;
		x += -gau[k]*im[i][I1] + gau[k]*im[i][I2];
	      }
	    }
	    sm[i][j] = x;
	  }
}
float norm (float x, float y)
{
	return (float) sqrt ( (double)(x*x + y*y) );
}

//gaussian 函数//
float gauss(float x)
{
    float xx;

    if (sigma == 0) return 0.0;
    xx = (float)exp((double) ((-x*x)/(2*sigma*sigma)));
    return xx;
}



// Gaussian函数的一阶倒数   //
float dGauss (float x)
{
	return -x/(sigma*sigma) * gauss(x);
}



//canny边缘检测.....................................//
void EX13(HWND hWnd)
{                                                       
   if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8)) return; 
 
   ClearDDB();
   WriteDDB(Image[0],  0,  0, 0, 0,512,512);
  
   
   ColorToGray(0,1);
   canny(Image[1],0,0,Image[1]->wid,Image[1]->hei);

   WriteDDB(Image[1],512,  0, 0, 0,512,512);
   InvalidateRect(hWnd,NULL,FALSE);
   Offset=0;
}




//小波变换.................................//
void EX14(HWND hWnd)    
{
   
 

   if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8)) 
	   return; 
 
   ClearDDB();
   WriteDDB(Image[0],  0,  0, 0, 0,512,512);

   ColorToGray(0,1);
   
   wavelet(Image[1],0,0,Image[1]->wid,Image[1]->hei);


   WriteDDB(Image[1],512,  0, 0, 0,512,512);
   InvalidateRect(hWnd,NULL,FALSE);
   Offset=0;
   
	
}
//小波函数//
void wavelet(struct IMAGE *image,int x,int y,int Dx,int Dy)
{  BYTE *buf1,*buf0;
  BYTE **list1,**list0;
   
     int i,j,Ni,Nj;
	float **original,**original1;

	float mse=0;

	Ni=Dx,Nj=Dy;

  
  buf1 =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
  buf0 =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
  getimage(image,x,y,Dx,Dy,buf1); 
  list1=(BYTE**) malloc(Dy*sizeof(BYTE*));
  list0=(BYTE**) malloc(Dy*sizeof(BYTE*));
  
  original=allocate_2d_float(Ni,Nj,0);
   original1=allocate_2d_float(Ni,Nj,0);
 
  for(i=0;i<Dy;i++) {
    list1[i]=buf1+i*Dx;
	list0[i]=buf0+i*Dx;
   
  }

//for(i=0;i<Dx;i++)
//		for(j=0;j<Dy;j++)
//			list1[i][j]=list1[i][j]+(float)(rand()/1000); 加噪声
	for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++) {
			
			original[i][j]=list1[i][j];
		}
	}

 	wavelet_transform_test(original,original1,Ni,Nj,1);

for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++) {
			        list0[i][j]=(BYTE)original1[i][j];
   }
}

for(i=1;i<Dy-1;i++) 
    setimage(image,x+1,y+i,Dx-2,1,&list0[i][1]); 
   
  free(buf1);  
  free(buf0);  
  free(list1);  
  free(list0);
 }
//小波变换.................................//
void EX17(HWND hWnd)    
{
   
 

   if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8)) 
	   return; 
 
   ClearDDB();
   WriteDDB(Image[0],  0,  0, 0, 0,512,512);

   ColorToGray(0,1);
   
   wavelet_edge(Image[1],0,0,Image[1]->wid,Image[1]->hei);


   WriteDDB(Image[1],512,  0, 0, 0,512,512);
   InvalidateRect(hWnd,NULL,FALSE);
   Offset=0;
   
	
}
//小波函数//
void wavelet_edge(struct IMAGE *image,int x,int y,int Dx,int Dy)
{  BYTE *buf1,*buf0;
  BYTE **list1,**list0;
   BYTE *buf2;
  BYTE **list2;
  int width;
	
	float **dx,**dy;
	int i,j;
	float  z;
    int low= 0,high=-1;
     int Ni,Nj;
	float **original,**original1;

	float mse=0;

	Ni=Dx,Nj=Dy;

  buf2 =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
  buf1 =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
  buf0 =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
  getimage(image,x,y,Dx,Dy,buf1); 
  list1=(BYTE**) malloc(Dy*sizeof(BYTE*));
  list0=(BYTE**) malloc(Dy*sizeof(BYTE*));
  list2=(BYTE**) malloc(Dy*sizeof(BYTE*));
  dx = allocate_2d_float(Dx,Dy,0);
  dy = allocate_2d_float(Dx,Dy,0); 

  original=allocate_2d_float(Ni,Nj,0);
   original1=allocate_2d_float(Ni,Nj,0);
 
  for(i=0;i<Dy;i++) {
    list1[i]=buf1+i*Dx;
	list0[i]=buf0+i*Dx;
     list2[i]=buf2+i*Dx; 
  }

//for(i=0;i<Dx;i++)
//		for(j=0;j<Dy;j++)
//			list1[i][j]=list1[i][j]+(float)(rand()/1000); 加噪声
	for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++) {
			
			original[i][j]=list1[i][j];
		}
	}

 	wavelet_transform_edge(original,original1,Ni,Nj,1);

for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++) {
			        list0[i][j]=(BYTE)original1[i][j];
   }
}
for(i=0;i<Ni;i++) {
		for(j=0;j<Nj;j++) {

	dx[i][j]=list0[i][j];
  
		}
}


wavelet_transform_edge(original,original1,Ni,Nj,0);

for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++) {
			        list0[i][j]=(BYTE)original1[i][j];
   }
}
for(i=0;i<Ni;i++) {
		for(j=0;j<Nj;j++) {

	dy[i][j]=list0[i][j];
  
		}
}
for (i=0; i<Ni; i++)
{ for (j=0; j<Nj; j++)
	  {  
	      z = norm (dx[i][j], dy[i][j]);
	     list0[i][j] = (unsigned char)(z*MAG_SCALE);
	  
	  }  
}
	nonmax_suppress (dx, dy, Image[1]->wid,Image[1]->hei, list0, list2);

	hysteresis (high, low, Image[1], list1,list0, list2);
    

	for(i=1;i<Dy-1;i++) 
    setimage(image,x+1,y+i,Dx-2,1,&list1[i][1]); 
  
	free(dx[0]); free(dx);
	free(dy[0]); free(dy);
   free(buf1);  
  free(buf0);  
  free(list1);  
  free(list0);
   free(buf2);  
    free(list2);
 }



  

 
  
 
   
  
  
  

	

 
//小波重构...........................................//
void EX15(HWND hWnd)    
{
   
 

   if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8)) 
	   return; 
 
   ClearDDB();
   WriteDDB(Image[0],  0,  0, 0, 0,512,512);

   ColorToGray(0,1);
   waveletinverse(Image[1],0,0,Image[1]->wid,Image[1]->hei);


   WriteDDB(Image[1],512,  0, 0, 0,512,512);
   InvalidateRect(hWnd,NULL,FALSE);
   Offset=0;
	
}
//小波回复//
void waveletinverse(struct IMAGE *image,int x,int y,int Dx,int Dy)
{  BYTE *buf1,*buf0;
  BYTE **list1,**list0;
   
     int i,j,Ni,Nj;
	float **original,**original1;

	float mse=0;

	Ni=Dx,Nj=Dy;

  
  buf1 =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
  buf0 =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
  getimage(image,x,y,Dx,Dy,buf1); 
  list1=(BYTE**) malloc(Dy*sizeof(BYTE*));
  list0=(BYTE**) malloc(Dy*sizeof(BYTE*));
  
  original=allocate_2d_float(Ni,Nj,0);
   original1=allocate_2d_float(Ni,Nj,0);
 
  for(i=0;i<Dy;i++) {
    list1[i]=buf1+i*Dx;
	list0[i]=buf0+i*Dx;
   
  }
	for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++) {
			
			original[i][j]=list1[i][j];
		}
	}

 	wavelet_inverse_test(original,original1,Ni,Nj);

for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++) {
			        list0[i][j]=(BYTE)original1[i][j];
   }
}
  for(i=1;i<Dy-1;i++) 
    setimage(image,x+1,y+i,Dx-2,1,&list0[i][1]); 
   
  free(buf1);  
  free(buf0);  
  free(list1);  
  free(list0);
 }
void EX18(HWND hWnd)    
{
   
 

   if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8)) 
	   return; 
 
   ClearDDB();
   WriteDDB(Image[0],  0,  0, 0, 0,512,512);

   ColorToGray(0,1);
   
   hmm_edge(Image[1],0,0,Image[1]->wid,Image[1]->hei);


   WriteDDB(Image[1],512,  0, 0, 0,512,512);
   InvalidateRect(hWnd,NULL,FALSE);
   Offset=0;
	
}

void hmm_edge(struct IMAGE *image,int x,int y,int Dx,int Dy)
{
    BYTE **list0,**list1;
     BYTE *buf0,*buf1;
float **original,**original1;
	struct HMM *phmm;
    int **O;
	int i,j,t,m,k;
	int T=3;
	double **alpha, **beta, **gamma;
	int *pniter;
	double *plogprobinit;
	double *plogprobfinal;
double **delta;
    int **psi;
    int **q;
    double *pprob;
   buf0 =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
 list0=(BYTE**) malloc(Dy*sizeof(BYTE*));
buf1 =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
 list1=(BYTE**) malloc(Dy*sizeof(BYTE*));
original=allocate_2d_float(Dx,Dy,0);
   original1=allocate_2d_float(Dx,Dy,0);
getimage(image,x,y,Dx,Dy,buf1); 
	O=(int **)imatrix(1,T,1,Dx/8*Dy/8);
    phmm =(struct HMM*)malloc(sizeof(struct HMM*));

	alpha=(double **)dmatrix(1,T,1,2);
	beta=(double **)dmatrix(1,T,1,2);
	gamma=(double **)dmatrix(1,T,1,2);
plogprobinit=dvector(1,T);
plogprobfinal=dvector(1,T);
pniter=ivector(1,T);
    
    delta=(double **)dmatrix(1,T,1,2);
    psi=(double **)dmatrix(1,T,1,2);
    q=(int **)imatrix(1,T,1,(Dx/8)*(Dy/8));
    pprob=dvector(1,2);
for(i=0;i<Dy;i++) 
{list0[i]=buf0+i*Dx;
   list1[i]=buf1+i*Dx;
}
for(i=0;i<Dx;i++) {
		
		for(j=0;j<Dy;j++) {
			
			original[i][j]=list1[i][j];
		}
	}

 	wavelet_transform_test(original,original1,Dx,Dy,1);

for(i=0;i<Dx;i++) {
		
		for(j=0;j<Dy;j++) {
			        list0[i][j]=(BYTE)original1[i][j];
   }
}
	wavelet_hmm_edgev(Image[1],0,0,Image[1]->wid,Image[1]->hei,O);

	InitHMM( phmm,2,256);
   

   BaumWelch(phmm, T,O,alpha,beta,
			   gamma,pniter,plogprobinit,plogprobfinal,Dx,Dy);
for(m=1;m<=(Dx/8)*(Dy/8);m++)
{
 ViterbiLog(phmm,T,O,delta,psi,q,pprob,m);

}
for(m=1;m<=(Dx/8)*(Dy/8);m++)
{
for(t=1;t<=T;t++)
 {
	 if(q[t][m]==1) q[t][m]=0;
	else q[t][m]=255;
 }
}
m=0;
for(i=1;i<=Dx/8;i++) {
		for(j=Dy/8;j<Dy/4;j++) {
			        m++;
			        list0[i-1][j]=q[1][m];
	}
}
m=0;
for(i=1;i<=Dx/4;i+=2) {
		for(j=Dy/4;j<Dy/2;j+=2) {
			        m++;
			        list0[i-1][j]=q[2][m];
                   
	}
}
m=0;
for(i=1;i<=Dx/2;i+=4) {
		for(j=Dy/2;j<Dy;j+=4) {
			        m++;

⌨️ 快捷键说明

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