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

📄 process.cpp

📁 这是VC++ 2003.net图像处理的光盘源程序!!!非常好的
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		for (i=0;i<Dx;i++) {
			if (!list0[j][i]) continue; 
			if (!listu[j][i]) list0[j][i]=0;
		}
	}
   
	for(k=0;k<Dy;k++) {
		if (listw[k]) free(listw[k]);
		if (listu[k]) free(listu[k]);
	}
	free(listw);  
	free(listu);  
}

void WINAPI MorphologyThin(BYTE **list0,BYTE **list1,int Dx,int Dy)
{ 
	long i,j,k,mark=1,m=0;
 
	while(mark) {
		mark=0;
		for (k=0;k<8;k++) {
			hmt(list0,list1,Dx,Dy,hMask[k],hMaskLen[k],
		                   mMask[k],mMaskLen[k]);
			for (j=0;j<Dy;j++) {
				for (i=0;i<Dx;i++) {
					if (list0[j][i]==1) {
						mark=1;
						list1[j][i]=0;
					}
				}
			}
		}
	}
}

void CreateDeleteTable(int *tab)
{ 
   int  Mask[8][8]={{1,2,0,0,0,2,1,1},{0,2,1,1,1,2,0,0},
                    {0,0,0,2,1,1,1,2},{1,1,1,2,0,0,0,2},
                    {2,0,0,0,2,1,1,1},{2,1,1,1,2,0,0,0},
                    {0,0,2,1,1,1,2,0},{1,1,2,0,0,0,2,1}};
   int	Table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
   int  i,j,k,n,s,t[4],tn;
  
   for (i=0;i<256;i++) tab[i]=0;
 
   for (i=0;i<8;i++) {
   	  s=0;
	  tn=0;
	  for (j=0;j<8;j++) {
		 if (Mask[i][j]==1) s |= Table[j]; 
		 else if (Mask[i][j]==2) {
			 t[tn++] = Table[j];
		 }
	  }
	  for (j=0;j<2;j++) {
         n=s;
		 if (j) n |= t[0];
		 for (k=0;k<2;k++) {
			if (k) n |= t[1];
			tab[n]=8*(i+1)+2*j+k;
		 }
	  }
   }
}
   
int  CrossM(BYTE **list,int x,int y)
{
  int  i,t;
  int  Mask3[9][2] ={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},
                     {-1, 0},{-1, 1},{ 0, 1},{ 1, 1},{ 1, 0}};

  for (i=0,t=0; i<8; i++) {
    if ((list[y+Mask3[i][1]][x+Mask3[i][0]]==0)&& 
        (list[y+Mask3[i+1][1]][x+Mask3[i+1][0]]>=1)) t++;
  }
  return(t);
}

void WINAPI PatternThin(BYTE **list,int Dx,int Dy)
{ 
   int  DeleteTab[256],mark=1;
   int  Mask[8][2]={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},
                    {-1, 0},{-1, 1},{ 0, 1},{ 1, 1}};
   int	Table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
   long i,j,k,n,model,a,b,c;
   BYTE **listw,*bufw;

   bufw =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
   listw=(BYTE**) malloc(Dy*sizeof(BYTE*));
   for(j=0;j<Dy;j++) {
      listw[j]=bufw+j*Dx;
	  memcpy(listw[j],list[j],Dx);
   }

   CreateDeleteTable(DeleteTab);
  
   n=0;
   while(mark) { 
 	  mark=0;
	  if (n%2==0) {
	     a=c=b=1;
	  }
	  else {
		 a=Dx-2;
		 c=Dy-2;
		 b=-1;
	  }
      for (j=c;j<Dy-1 && j>0;j+=b) {
         for (i=a;i<Dx-1 && i>0;i+=b) {
            if (list[j][i]==0) continue;
            model=0;
		    for (k=0;k<8;k++) {
		       if (list[j+Mask[k][1]][i+Mask[k][0]])
			      model |= Table[k];
			}
		    if (DeleteTab[model]) {
			   if (CrossM(listw,i,j)<2) {
                  mark=1;
		          listw[j][i]=0;
			   }
			}
		 }
	  }
	  n++;
      for (j=1;j<Dy-1;j++) 
	     memcpy(list[j],listw[j],Dx);
   }
  
   free(bufw);
   free(listw);  
}

void WINAPI gerosion(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
  int  i,j,k,m,n,g;
  BYTE *bp,*p;
  BYTE Mask[25];

  memset(Mask,1,9);
  for(i=1;i<Dy-1;i++) {
    for (j=1;j<Dx-1;j++) {
      p=Mask;	
      for (m=0,g=255;m<3;m++) {	
        bp=list1[i-1+m]+j-1;	
		for (n=0;n<3;n++) {
		  if (*p++) {
			k=(*bp++);
			if (k<g) g=k;
		  }
 		}
      }
      list0[i][j] = g;           
    }
  }
}

void WINAPI gdilation(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
  int  i,j,k,m,n,g;
  BYTE *bp,*p;
  BYTE Mask[25];

  memset(Mask,1,9);
  for(i=1;i<Dy-1;i++) {
    for (j=1;j<Dx-1;j++) {
      p=Mask;	
      for (m=0,g=0;m<3;m++) {	
        bp=list1[i-1+m]+j-1;	
		for (n=0;n<3;n++) {
		  if (*p++) {
			k=(*bp++);
			if (k>g) g=k;
		  }
 		}
      }
      list0[i][j] = g;           
	}
  }
}

void WINAPI GErosion(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
   gerosion(list0,list1,Dx,Dy);
}

void WINAPI GDilation(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
   gdilation(list0,list1,Dx,Dy);
}

void WINAPI GGrad(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
  BYTE *bufw;
  BYTE **listw;
  int  i,j;
 
  bufw =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
  listw=(BYTE**) malloc(Dy*sizeof(BYTE*));
  for(i=0;i<Dy;i++) listw[i]=bufw+i*Dx;
  
  gdilation(list0,list1,Dx,Dy);
  gerosion(listw,list1,Dx,Dy); 
 
  for (i=1;i<Dy-1;i++) {
	for (j=1;j<Dx-1;j++) {
      list0[i][j]=list0[i][j]-listw[i][j];
 	}
  }

  free(bufw);  
  free(listw);  
}  

void WINAPI GIBorder(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
  int  i,j;
 
  gerosion(list0,list1,Dx,Dy);
  for (i=1;i<Dy-1;i++) {
	for (j=1;j<Dx-1;j++) {
      list0[i][j] = list1[i][j]-list0[i][j];
	}
  }
}  

void WINAPI GOBorder(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
  int  i,j;
 
  gdilation(list0,list1,Dx,Dy);
  for (i=1;i<Dy-1;i++) {
	for (j=1;j<Dx-1;j++) {
      list0[i][j] = list0[i][j]-list1[i][j];
	}
  }
}  

int		G_Thre=1;

void WINAPI GTopHat(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
  BYTE *bufw;
  BYTE **listw;
  int  i,j,k;
 
  bufw =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
  listw=(BYTE**) malloc(Dy*sizeof(BYTE*));
  for(i=0;i<Dy;i++) listw[i]=bufw+i*Dx;
 
  gerosion(list0,list1,Dx,Dy); 
  gdilation(listw,list0,Dx,Dy);

  for (i=1;i<Dy-1;i++) {
	for (j=1;j<Dx-1;j++) {
      k=(int) list1[i][j]-listw[i][j];
	  if (k>=G_Thre) k=1;
	  else k=0;
      list0[i][j]=k;
 	}
  }
  free(bufw);  
  free(listw);  
}  

void WINAPI GBlackTopHat(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
  BYTE *bufw;
  BYTE **listw;
  int  i,j,k;
 
  bufw =(BYTE*)  malloc(Dx*Dy*sizeof(BYTE));
  listw=(BYTE**) malloc(Dy*sizeof(BYTE*));
  for(i=0;i<Dy;i++) listw[i]=bufw+i*Dx;
 
  gdilation(list0,list1,Dx,Dy); 
  gerosion(listw,list0,Dx,Dy);

  for (i=1;i<Dy-1;i++) {
	for (j=1;j<Dx-1;j++) {
      k=(int) listw[i][j]-list1[i][j];
	  if (k>=G_Thre) k=0;
	  else k=1;
      list0[i][j]=k;
 	}
  }
  free(bufw);  
  free(listw);  
}  

long WINAPI SearchScale(long *pg,int n)
{
	int  i,j,k,m;
	int  tab[256];
	long max;

	for (i=0;i<256;i++) tab[i]=i;                  
	for (i=0;i<255;i++) {           
		max=pg[tab[i]];    
		k=i;
		for (j=i+1;j<256;j++) {
			if (pg[tab[j]]>max) {
				max=pg[tab[j]];   
				k=j;
			}
		}
		m=tab[k];     tab[k]=tab[i];
		tab[i]=m;
	}
	if (n>0) n--;
	return(pg[tab[n]]);
}

void TableSmooth(long *pg, int m, int n)	//  曲线平滑
{
  int i,j,k;

  for (j=0;j<n;j++) {
    k=pg[0];
    for (i=1;i<m-1;i++) pg[i-1]=(pg[i-1]+pg[i]+pg[i+1])/3;	 
    for (i=m-1;i>0;i--) pg[i]=pg[i-1];	 
    pg[0]=k;
  }
}

//----------------------------------------------------------------------

#define	BOUND(x,mn,mx)	((x)<(mn)?(mn):((x)>(mx)?(mx):(x)))

int  calchue(int angle,int col1,int col2,int min)   //  计算色调值
{
   int  rcode;

   rcode=(int) (256.0*(angle+((120.0)*(col1-min)/
		(col1+col2-(min+min))))/360.0+0.5);
   return(rcode);
}

void maxmin(int val1,int val2,int val3,int *max,int *min)
{                                     //  求三个数中的最大、最小值
   if (val1>=val2) {
      if (val1>=val3) {
	 *max = val1;
	 *min = (val2<=val3) ? val2 : val3;
      }
      else {
	 *max=val3;	*min=val2;
      }
   }
   else {
      if (val2>=val3) {
	 *max = val2;
	 *min = (val1<=val3) ? val1 :val3;
      }
      else {
	 *max=val3;     *min=val1;
      }
   }
}

void WINAPI RgbToHsv(BYTE *hsvpal,BYTE *rgbpal,int count)
{                                      //  RGB 模式转换成 HSV 模式
   int  hue,sat,red,grn,blu,col1,col2,angle;
   int  j,max,min;

   for (j=0;j<count;j++) {
      blu=*rgbpal++;	grn=*rgbpal++;             
      red=*rgbpal++;
      maxmin(red,grn,blu,&max,&min);             
      if (max==min) {                  
	     hue=0;    sat=0;
      }
      else {                                             
		  if (min==blu) {                         
	    angle=0;    col1=grn;    col2=red;
	 }
		  else if (min==red) {                    
	    angle=120;  col1=blu;    col2=grn;
	 }
		  else if (min==grn) {                    
	    angle=240;  col1=red;    col2=blu;
	 }
	 hue=calchue(angle,col1,col2,min);           
	 sat=(int) (255.0*(max-min)/max);            
      }
      *hsvpal++=(BYTE) hue;                         
      *hsvpal++=(BYTE) sat;
      *hsvpal++=(BYTE) max;
   }
}

void WINAPI HsvToRgb(BYTE *rgbpal,BYTE *hsvpal,int count)
{                                      //  HSV 模式转换成 RGB 模式
   int  j,red,grn,blu,hue,sat,max,min;

   for (j=0;j<count;j++) {
      hue=*hsvpal++;	sat=*hsvpal++;             
      max=*hsvpal++;
      hue=(int)(360.0*hue/255.0);              
      if (sat==0) {                       
	 red=grn=blu=max;                            
      }
      else {                                       
	 min=(int)((255.0-sat)*max/255.0);         
	 if (hue<=120) {                           
	    blu=min;                                 
	    if (hue<=60) {
	       red=max;                              
	       grn=(int)(min+(double)hue*(max-min)/(120.0-hue));
	    }
	    else {
	       grn=max;                              
	       red=(int)(min+(120.0-hue)*(max-min)/hue);
	    }
	 }
	 else if (hue<=240) {                      
	    red=min;                                 
	    if (hue<=180) {
	       grn=max;                              
	       blu=(int)(min+(hue-120.0)*(max-min)/(240.0-hue));
	    }
	    else {
	       blu=max;                              
	       grn=(int)(min+(240.0-hue)*(max-min)/(hue-120.0));
	    }
	 }
	 else {                                    
	    grn=min;                                 
	    if (hue<=300) {
	       blu=max;                              
	       red=(int)(min+(hue-240.0)*(max-min)/(360.0-hue));
	    }
	    else {
	       red=max;                              
	       blu=(int)(min+(360.0-hue)*(max-min)/(hue-240.0));
	    }
	 }
      }
      *rgbpal++=(BYTE) blu;                         
      *rgbpal++=(BYTE) grn;
      *rgbpal++=(BYTE) red;
   }
}

int  WINAPI HueHistogShift(long *pg)
{
   int  i,j,p,dp;
   long pg0[256],kk;
   BYTE *buf1,*buf0;
   
   p=42;
   for (i=0;i<256;i++) {
	  pg0[i]=0;
      for (j=i-p;j<i+p;j++) pg0[i]+=pg[(j+256)%256];
   }
 
   kk=pg0[0];		dp=0;
   for (i=0;i<256;i+=85) { 
      if (pg0[i]<kk) {
	     kk=pg0[i];
		 dp=i;
	  }
   }

   buf0=(BYTE*) (&pg0[256-dp]);
   buf1=(BYTE*) (&pg[0]);
   memcpy(buf0,buf1,sizeof(long)*dp);
   buf0=(BYTE*) (&pg0[0]);
   buf1=(BYTE*) (&pg[dp]);
   memcpy(buf0,buf1,sizeof(long)*(256-dp));
   buf0=(BYTE*) (&pg0[0]);
   buf1=(BYTE*) (&pg[0]);
   memcpy(buf1,buf0,sizeof(long)*256);
   return(dp);
}

double	DoubleTab[256];

void WINAPI RgbToYiq(BYTE *yiqpal,BYTE *rgbpal,int count)
{
	int		i,x;
	double	B,G,R,Y,I,Q;

	for (x=0,i=0;x<count;x++,i+=3) {
		B=DoubleTab[rgbpal[i]];
		G=DoubleTab[rgbpal[i+1]];
		R=DoubleTab[rgbpal[i+2]];
		Y=0.29889531*R+0.58662247*G+0.11448223*B;
		I=0.59597799*R-0.27417610*G-0.32180189*B;
		Q=0.21147017*R-0.52261711*G+0.31114694*B;
		yiqpal[i]  =(BYTE) (255*Y);
		yiqpal[i+1]=(BYTE) ((I/0.595978+1)*127);
		yiqpal[i+2]=(BYTE) ((I/0.522617+1)*127);
	}
}

double fPow3(double xyz)
{
	double t;

	if (xyz>0.008856) t=pow(xyz,0.333333);
 	else  t=7.787*xyz+0.1379;
 	return(t);
}

void WINAPI RgbToLab(BYTE *labpal,BYTE *rgbpal,int count)
{
	int		i,x;
	double	B,G,R,X,Y,Z,L,a,b;

 	for (x=0,i=0;x<count;x++,i+=3) {
		B=DoubleTab[rgbpal[i]];
		G=DoubleTab[rgbpal[i+1]];
		R=DoubleTab[rgbpal[i+2]];
		X=0.49018626*R+0.30987954*G+0.19993420*B;
		Y=0.17701522*R+0.81232418*G+0.01066060*B;
		Z=0.00000000*R+0.01007720*G+0.98992280*B;
		if (Y>0.008856) 
			L=116*pow(Y,0.333333)-16;
		else 
			L=903.3*Y;
		a=500*(fPow3(X)-fPow3(Y));
		b=200*(fPow3(X)-fPow3(Z));
		labpal[i]  =(BYTE) (255*L/100);
		labpal[i+1]=(BYTE) (255*(a+128.179003)/310.505326);
		labpal[i+2]=(BYTE) (255*(b+ 82.377974)/224.847274);
	}
}

//------------------------------------------------

int	   ThreTable[256];
int    *code;
POINT  *dot;
int	   code_n,dot_n;
int    inc[8][2] = { {+1, 0},{+1,-1},{ 0,-1},{-1,-1},
                     {-1, 0},{-1,+1},{ 0,+1},{+1,+1}  };
int    Trx1,Try1,Trx2,Try2;
int    ppp;
long   sss;
double factor;
struct TAB *tab;

void set_thre(int track_f, int isr)
{            	      
   int  k;

   for (k=0;k<256;k++) {
      if (track_f==0) {
	 if (k>isr) ThreTable[k]=0;
	 else       ThreTable[k]=1;	     
      }
      else {
	 if (k<isr) ThreTable[k]=0;
	 else       ThreTable[k]=1;         
      }
   }
}

int  WINAPI SingleTrack(BYTE **list,int i,int j,int iop,int *code,int flag)
{               
   int  kw,code_n;
   int  curr[2],next[2];               
   int  n,n1,u,ki,kj,ns,ne;
  
   if (flag==4) u=2;
   else         u=1;

   code[0]=curr[0]=next[0]=i;    
   code[1]=curr

⌨️ 快捷键说明

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