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

📄 algorithm.c

📁 基于dsp的图像重现
💻 C
字号:
#include "stdio.h"
#include "math.h"
#include "algorithm.h"



void getBinaryImage(unsigned char *imagey,unsigned char *imagecb, unsigned char *imagecr,Byte *BinaryImage,Size size)
{
   int i,j;
     for(i=0;i<size.cy;i++)
           for(j=0;j<(size.cx>>1);j++)
             {
                 if((imagecb[i*(size.cx>>1)+j]<150) && (imagecb[i*(size.cx>>1)+j]>140))
                     
                      {
                        BinaryImage[2*i*(size.cx>>1)+2*j] = 1;
                        BinaryImage[2*i*(size.cx>>1)+2*j+1]=1;
                        /*imagey[2*i*(size.cx>>1)+2*j] = 0;
                        imagey[2*i*(size.cx>>1)+2*j+1]=0;
                        imagecb[i*(size.cx>>1)+j] =0;
                        imagecr[i*(size.cx>>1)+j] =0;*/ 
 					  }
               
               }
  
}



//寻找连通区域
int findConnectComp(Byte* img, Byte *Dst,Size size ,int *counter)
{

int list[500];

//用于存放相应的标记号 这个算法有比较大的空间浪费

int label=1;//初始使用1
int width=size.cx;
int height=size.cy;
int kx,ky;//用于标志附近的值
int minlabel=-1,lab[5];//label

int i,j,ind;//循环变量


int curlab=-1;

int max=0;


list[0] = -1;

for(i=0;i<height;i++)
 for( j=0;j<width;j++)
 {
	 
	 if(img[i*width+j]==0)
		 continue;
	  
	 
      minlabel=-1;
	  lab[1]=-1;lab[2]=-1;lab[3]=-1;lab[4]=-1;
   
   ky=i-1;
   kx=j+1;//右上
    
 if((ky<height)&&(ky>=0&&kx>=0)&&(kx<width)&&(img[ky*width+kx])>0)
	{
       lab[1]=Dst[ky*width+kx];
		minlabel=Dst[ky*width+kx];
		
    }

   ky=i-1;
   kx=j;//上
    if(ky<height&&ky>=0&&kx>=0&&kx<width&&img[ky*width+kx]>0)
	{
       
		lab[2]=Dst[ky*width+kx];
	 if(minlabel>lab[2]||minlabel==-1)
	 {
	  minlabel=lab[2];
	
	 }
    }
 
   ky=i-1;
   kx=j-1;//左上
    if(ky<height&&ky>=0&&kx>=0&&kx<width&&img[ky*width+kx]>0)
	{
	
		lab[3]=Dst[ky*width+kx];
    if(minlabel>lab[3]||minlabel==-1)
	 {
		minlabel=lab[3];
       
	 }
	}

   ky=i;
   kx=j-1;//左
    if(ky<height&&ky>=0&&kx>=0&&kx<width&&img[ky*width+kx]>0)
	{

		lab[4]=Dst[ky*width+kx];
        if(minlabel>lab[4]||minlabel==-1)
		{
	      minlabel=lab[4];
       
		}
	}



 if(minlabel<0)//一直没有赋值
 {
	 
	 Dst[i*width+j]=label;
	 list[label]=-1;
     label++;
	
 }
else//minlabel>=0
  {//加入号码
		
  if(lab[1]==lab[2]&&lab[1]==lab[3]&&lab[3]==lab[4])//所有都一样
   {
     Dst[i*width+j]=minlabel;
   }
  else if(minlabel==(lab[1]+lab[2]+lab[3]+lab[4]+3)) //只有一个一样
  {

	  Dst[i*width+j]=minlabel;
  }
     else //有不一样的
	 {
	
       Dst[i*width+j]=minlabel;
       for( ind=1;ind<=4;ind++)
	   {
		   if(lab[ind]>=1)
		   {
		     if(lab[ind]!=minlabel)
	            list[lab[ind]]=minlabel;
	   
		   }
	   }
	 }
	
   
  }
if(img[i*width+j]>0&&Dst[i*width+j]<=0)
{
Dst[i*width+j]=label;
list[label++]=-1;
}
  
}

//取代标记号

for( i=0;i<height;i++)
 for( j=0;j<width;j++)
 {
 if(Dst[i*width+j]>0)
 {
    curlab=Dst[i*width+j];
 
	 while (list[curlab]!=-1)//搜索最小的标记号
	 {

		 curlab=list[curlab];

	 }
	 
 Dst[i*width+j]=curlab;
 if(curlab<200)
 counter[curlab]++;
 }
}
 
for(i=1;i<200;i++)
{
  if(counter[i]>0)
  max++;
}

return max;
}

float InRect1(Byte *img,Size size,Rect rect,int index)
{
int left,right,top,bottom,i,j;
float k;
long sum=0;
left=rect.left>=0?rect.left:0;
right=rect.right<size.cx?rect.right:size.cx;
top=rect.top>=0?rect.top:0;
bottom=rect.bottom<size.cy?rect.bottom:size.cy;

for( i=top;i<bottom;i++)
 for( j=left;j<right;j++)
 {
  if(img[i*size.cx+j]==index)
    sum++;
  }
 
k=(float)(sum)/(float)(abs(rect.right-rect.left)*abs(rect.top-rect.bottom));
return k;
}




void FillRect1(Byte *img,Rect rect,Size size,int index)
{
int left,right,top,bottom,i,j;

left=rect.left>=0?rect.left:0;
right=rect.right<size.cx?rect.right:size.cx;
top=rect.top>=0?rect.top:0;
bottom=rect.bottom<size.cy?rect.bottom:size.cy;

for(i=top;i<bottom;i++)
 for(j=left;j<right;j++)
 {
 if(img[i*size.cx+j]==0)
    img[i*size.cx+j]=index;
  }

}

Rect Swell1(Byte *img,Size size,int index/*表征第几个连通区*/)//不应该突变
{
   int width=size.cx;
   int height=size.cy;
   long sumx=0;
   long sumy=0;

   long sum=0;

  int i,j;
  int x;
  int y;
  
  Rect rect,newrect;
  int iter=7;
  
  for(i=0;i<height;i++)
     for(j=0;j<width;j++)
	 {
	 if(img[i*width+j]==index)
	  {
			
        sumx+=j;
	    sumy+=i;
	    sum++;
	  }
	 
	 }
     sum=sum+1; //防止出现0
	 
	x=sumx/sum;
	y=sumy/sum;



rect.left=(x-2);
rect.right=(x+2);
rect.top=(y-2);
rect.bottom=(y+2);


for(i=0;i<iter;i++)
{
   
	for(j=4;j>=0;j--)
{
	newrect=rect;
		switch(j)
	{
	case 0://left
		
		//while(InRect(img,size,newrect)>=InRect(img,size,rect)-0.04&&InRect(img,size,newrect)>0.95)
			while(InRect1(img,size,newrect,index)>0.98)
		{
		  rect=newrect;
		  if(rect.left<=0)
		  {
			  rect.left=0;
			  break;
		  }
		  newrect.left-=3;
		}
		   
		
		FillRect1(img,rect,size,index);
		
		break;
	case 1://right;
	//while(InRect(img,size,newrect)>=InRect(img,size,rect)-0.04&&InRect(img,size,newrect)>0.95)
		while(InRect1(img,size,newrect,index)>0.98)
		{
		  rect=newrect;
		  if(rect.right>size.cx-1)
		  {
			  rect.right=size.cx-1;
			  break;
		  }
			  newrect.right+=3;
		}
		   
		FillRect1(img,rect,size,index);
		
		
		break;


	case 2:
//	while(InRect(img,size,newrect)>=InRect(img,size,rect)-0.04&&InRect(img,size,newrect)>0.95)
		while(InRect1(img,size,newrect,index)>0.96)
		{
		 rect=newrect;
		  if(rect.top<=0)
		  {
			  rect.top=0;
			  break;
		  }
		  
		   newrect.top-=3;
		}
		   
		
		FillRect1(img,rect,size,index);
		
		break;

    case 3:

		while(InRect1(img,size,newrect,index)>0.96)
		{
		  rect=newrect;
		  if(rect.bottom>size.cy-1)
		  {
			 rect.bottom=size.cy-1;
			  break;
		  }
		  newrect.bottom+=3;
		}
		   
		
		FillRect1(img,rect,size,index);
		
		break;
	}
	

   }

  }

  return rect;
}

⌨️ 快捷键说明

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