📄 algorithm.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 + -