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

📄 linethinning.c

📁 本下载文件是《C/C++图像处理编程》一书的演示程序
💻 C
字号:
//     Ex12    
//   线条细化
 
#include <windows.h>
#include "image32.h"

extern HDC	  hMemDC;
extern struct IMAGE	*image;
extern struct IMAGE *Image[10];
  
void ColorToGray(int m,int n);                                            //  变灰阶
void ImageCopy(int m,int n);            //  图象复制

void Trans1to8(BYTE *sc,int BytesPerLine)
{
  int  j,m,n;

  for (j=BytesPerLine-1;j>-1;j--)  {
    for (n=7,m=1;n>-1;n--) {
      if ((sc[j]) & m)  sc[8*j+n]=1;
      else              sc[8*j+n]=0;
      m=m<<1;
    }
  }
}

void BinaryToGray(int m,int n)
{              //  图象复制 (二值图像转换成256色图像)
   int   i,wid,hei,bpl,bits,bpln;
   BYTE  *p1,*p2;

   if (Image[m]->hdib==NULL) return;
   wid =Image[m]->wid;		hei =Image[m]->hei;
   bpl =Image[m]->bpl;		bits=Image[m]->bitcount;
   if (bits>1) return;

   ImageCreate(Image[n],wid,hei,8);

   bpln =Image[n]->bpl;
   p1=(BYTE*) Image[m]->lpbi+40;
   p2=(BYTE*) Image[n]->lpbi+40;
   memcpy(p2,p1,8);

   p1=Image[m]->lpbits;
   p2=Image[n]->lpbits;
   for (i=0;i<hei;i++) {
      memcpy(p2,p1,bpl);
	  Trans1to8(p2,bpl);
 	  p1+=bpl;
	  p2+=bpln;
   }
}

int Cross(int* f)		            /*  四邻点处正跳变计数  */
{
	int  i,sum;

	for (i=1,sum=0; i<=7; i+=2) {
      if ((!f[i]) && (f[i+1] || f[i+2]))  sum++;
	}                         
	return(sum);
}

void Hilditch(struct IMAGE * image,int x,int y,int Dx,int Dy)
{
   int  i,j,k,m,n,flag;
   int  sum=0, f[10];
   char **list;

   list=(char**)malloc(Dy*sizeof(char*));
   for (i=0;i<Dy;i++) {
      list[i]=(char*) malloc(Dx*sizeof(char));
      getimage(image,x,y+i,Dx,1,list[i]);     
   }

   i=1;		                                
   do {
      flag=0;		                      
      for (k=1; k<Dy-1; k++) {		      
	 for (j=1; j<Dx-1; j++) {	
	    if (list[k][j] != 1)  continue;       
	    f[1]=list[k][j+1];	f[2]=list[k-1][j+1];
	    f[3]=list[k-1][j]; 	f[4]=list[k-1][j-1];
	    f[5]=list[k][j-1];	f[6]=list[k+1][j-1];
	    f[7]=list[k+1][j];	f[8]=list[k+1][j+1];
						
	    for (m=1,n=0; m<=8; m++) {
	       if (f[m]==-i) {
		  f[m]=1;  		  
		  n++;		      
	       }
	       else if (f[m]<0)  f[m]=0;
	    }

	    sum=f[1]+f[3]+f[5]+f[7];	
	    if (sum>=4) continue;      

	    f[9]=f[1];
	    for (m=1, sum=0; m<=8; m++)
	       if (f[m]==1)   sum++;
	    if ((sum<=1)||(sum-n==0))  continue;
 
	    sum=Cross(f);
	    if (sum!=1)  continue;
	    if (list[k-1][j]== -i) {
	       f[3]=0;
	       sum=Cross(f);		
	       if (sum!=1)  continue;
	    }
	    if (list[k][j-1]== -i) {
	       f[5]=0;
	       sum=Cross(f);		
	       if (sum!=1)  continue;
	    }

	    setpixel(image,x+j, y+k, 0); 
	    list[k][j]=-i;   
	    flag=1; 		 
	 }
      }
      i++;		         
   }
   while(flag==1);	     

   for (i=0;i<Dy;i++)
      if (list[i]) free(list[i]);
   free(list);                   
}

void LineThinning(HWND hWnd)
{
   if ((Image[0]->hdib==NULL)||(Image[0]->bitcount>1)) return; 

   ClearDDB();
   WriteDDB(Image[0],  0,  0, 0, 0,512,512);

   BinaryToGray(0,1);
   Hilditch(Image[1],  0,  0,Image[1]->wid,Image[1]->hei);
   WriteDDB(Image[1],  0,150, 0, 0,512,512);
   InvalidateRect(hWnd,NULL,FALSE);
}


⌨️ 快捷键说明

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