📄 colorgrow.cpp
字号:
xy6g=imageing[x+j+1][y+i]-imageing[x][y];
xy6b=imageinb[x+j+1][y+i]-imageinb[x][y];
xy8r=imageinr[x+j][y+i+1]-imageinr[x][y];
xy8g=imageing[x+j][y+i+1]-imageing[x][y];
xy8b=imageinb[x+j][y+i+1]-imageinb[x][y];
sum=ABS(0.3*xy2r+0.59*xy2g+0.11*xy2b)*2+ABS(-0.1684*xy2r-0.3316*xy2g+0.5*xy2b)+ABS(0.5*xy2r-0.4187*xy2g-0.0813*xy2b)+
ABS(0.3*xy4r+0.59*xy4g+0.11*xy4b)*2+ABS(-0.1684*xy4r-0.3316*xy4g+0.5*xy4b)+ABS(0.5*xy4r-0.4187*xy4g-0.0813*xy4b)+
ABS(0.3*xy6r+0.59*xy6g+0.11*xy6b)*2+ABS(-0.1684*xy6r-0.3316*xy6g+0.5*xy6b)+ABS(0.5*xy6r-0.4187*xy6g-0.0813*xy6b)+
ABS(0.3*xy8r+0.59*xy8g+0.11*xy8b)*2+ABS(-0.1684*xy8r-0.3316*xy8g+0.5*xy8b)+ABS(0.5*xy8r-0.4187*xy8g-0.0813*xy8b);
if(sum<240)
{
imageinr[x+j][y+i]=0;
imageing[x+j][y+i]=255;
imageinb[x+j][y+i]=0;
l++;
}
}*/
}
}
if(cnt4>0&&i<x)
{
s+=cnt4;
cnt4=0;
m40=MIN(i,y-h);
m4=MIN(i,y);
mix++;
for(j=m40;j>-m4;j--)
{
// xy5r=imageinr[x-i][y+j]-imageinr[x][y];
// xy5g=imageing[x-i][y+j]-imageing[x][y];
// xy5b=imageinb[x-i][y+j]-imageinb[x][y];
y5=0.3*imageinr[x-i][y+j]+0.59*imageing[x-i][y+j]+0.11*imageinb[x-i][y+j];
u5=-0.17*imageinr[x-i][y+j]-0.33*imageing[x-i][y+j]+0.5*imageinb[x-i][y+j];
v5=0.5*imageinr[x-i][y+j]-0.42*imageing[x-i][y+j]-0.08*imageinb[x-i][y+j];
fi=ABS(y5-y0);
fs=ABS(sqrt(u5*u5+v5*v5)-sqrt(u0*u0+v0*v0));
fh=(int)(100*ABS((u5*v0-v5*u0)/(u5*u0+v5*v0)));
// sum=ABS(0.3*xy5r+0.59*xy5g+0.11*xy5b)*2+ABS(-0.1684*xy5r-0.3316*xy5g+0.5*xy5b)+
// ABS(0.5*xy5r-0.4187*xy5g-0.0813*xy5b);
if(fi<30&&fs<15&&fh<10)
{
cnt4++;
// imageinr[x-i][y+j]=255-imager0;
// imageing[x-i][y+j]=255-imageg0;
// imageinb[x-i][y+j]=255-imageb0;
imageinr[x-i][y+j]=0;
imageing[x-i][y+j]=0;
imageinb[x-i][y+j]=0;
sx+=-i;
sy+=j;
/* if(j<mix) mix=-i;
if(j>max) max=-i;
if(i<miy) miy=j;
if(i>may) may=j;*/
}
/* else
{
xy2r=imageinr[x-i][y+j-1]-imageinr[x][y];
xy2g=imageing[x-i][y+j-1]-imageing[x][y];
xy2b=imageinb[x-i][y+j-1]-imageinb[x][y];
xy4r=imageinr[x-i-1][y+j]-imageinr[x][y];
xy4g=imageing[x-i-1][y+j]-imageing[x][y];
xy4b=imageinb[x-i-1][y+j]-imageinb[x][y];
xy6r=imageinr[x-i+1][y+j]-imageinr[x][y];
xy6g=imageing[x-i+1][y+j]-imageing[x][y];
xy6b=imageinb[x-i+1][y+j]-imageinb[x][y];
xy8r=imageinr[x-i][y+j+1]-imageinr[x][y];
xy8g=imageing[x-i][y+j+1]-imageing[x][y];
xy8b=imageinb[x-i][y+j+1]-imageinb[x][y];
sum=ABS(0.3*xy2r+0.59*xy2g+0.11*xy2b)*2+ABS(-0.1684*xy2r-0.3316*xy2g+0.5*xy2b)+ABS(0.5*xy2r-0.4187*xy2g-0.0813*xy2b)+
ABS(0.3*xy4r+0.59*xy4g+0.11*xy4b)*2+ABS(-0.1684*xy4r-0.3316*xy4g+0.5*xy4b)+ABS(0.5*xy4r-0.4187*xy4g-0.0813*xy4b)+
ABS(0.3*xy6r+0.59*xy6g+0.11*xy6b)*2+ABS(-0.1684*xy6r-0.3316*xy6g+0.5*xy6b)+ABS(0.5*xy6r-0.4187*xy6g-0.0813*xy6b)+
ABS(0.3*xy8r+0.59*xy8g+0.11*xy8b)*2+ABS(-0.1684*xy8r-0.3316*xy8g+0.5*xy8b)+ABS(0.5*xy8r-0.4187*xy8g-0.0813*xy8b);
if(sum<240)
{
imageinr[x-i][y+j]=0;
imageing[x-i][y+j]=255;
imageinb[x-i][y+j]=0;
l++;
}
}*/
}
}
}
s-=4;
if(s<1) s=1;
int xx=sx/s+x;
int yy=sy/s+y;
int mh=(miy+may)/2;
int mw=(mix+max)/2;
if((mw+xx)>40) mw=40-xx;
else if((xx-mw)<0) mw=xx;
if((mh+yy)>40) mh=40-yy;
else if((yy-mh)<0) mh=yy;
// *x_x=xx;
// *y_y=yy;
for(i=-mh;i<mh;i++)
for(j=-mw;j<mw;j++)
// for(i=-miy;i<may;i++)
// for(j=-mix;j<max;j++)
{
/* imageinr[j+x][i+y]=0;
imageing[j+x][i+y]=255;
imageinb[j+x][i+y]=0;*/
imageinr[j+xx][i+yy]=0;
imageing[j+xx][i+yy]=255;
imageinb[j+xx][i+yy]=0;
}
}
void CColorGrow::Grow2(int imageinr[][200], int imageing[][200], int imageinb[][200], int *x_x, int *y_y, int w, int h, int *R, int *G, int *B)
{
double y0,u0,v0,y5,u5,v5;
double fi,fs,fh;
double sat0,fhue0,sat5,fhue5,length;
int x=*x_x;
int y=*y_y;
int imager0=imageinr[x][y];
int imageg0=imageing[x][y];
int imageb0=imageinb[x][y];
y0=0.3*imager0+0.59*imageg0+0.11*imageb0;
u0=-0.17*imager0-0.33*imageg0+0.5*imageb0;
v0=0.5*imager0-0.42*imageg0-0.08*imageb0;
length=u0*u0+v0*v0;
sat0=sqrt(length);
if(sat0>0)
{
fhue0=atan2(u0,v0)*180.0/PIE;
if(fhue0<0) fhue0=fhue0+360.0;
}
else fhue0=0;
// sat0=65;
// fhue0=319;
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
y5=0.3*imageinr[j][i]+0.59*imageing[j][i]+0.11*imageinb[j][i];
u5=-0.17*imageinr[j][i]-0.33*imageing[j][i]+0.5*imageinb[j][i];
v5=0.5*imageinr[j][i]-0.42*imageing[j][i]-0.08*imageinb[j][i];
fi=ABS(y5-y0);
fs=ABS(sqrt(u5*u5+v5*v5)-sqrt(u0*u0+v0*v0));
fh=100.0*ABS((u5*v0-v5*u0)/(u5*u0+v5*v0));
length=u5*u5+v5*v5;
sat5=sqrt(length);
if(sat5>0)
{
fhue5=atan2(u5,v5)*180.0/PIE;
if(fhue5<0) fhue5=fhue5+360.0;
}
else fhue5=0;
// fh=ABS(fhue5-fhue0);
// fs=ABS(sat5-sat0);
if(fh<10&&fs<15)
{
imageinr[j][i]=imageing[j][i]=imageinb[j][i]=0;
}
}
}
}
void CColorGrow::Grow3(int imageinr[][200], int imageing[][200], int imageinb[][200], int *x_x, int *y_y, int w, int h, int n, int *R, int *G, int *B)
{
int i,j,cnt1,cnt2,cnt3,cnt4;
double y0,u0,v0;
double y5,u5,v5;
int s,l,sx,sy;
int m1,m2,m3,m4,m10,m20,m30,m40;
double fi,fs,fh;
cnt1=cnt2=cnt3=cnt4=1;
s=l=sx=sy=0;
int x=*x_x;
int y=*y_y;
int imager0=imageinr[x][y];
int imageg0=imageing[x][y];
int imageb0=imageinb[x][y];
y0=0.3*imager0+0.59*imageg0+0.11*imageb0;
u0=-0.17*imager0-0.33*imageg0+0.5*imageb0;
v0=0.5*imager0-0.42*imageg0-0.08*imageb0;
int max,mix,may,miy;
max=may=0;
mix=miy=0;
for(i=1;i<n;i++)
{
if(cnt1>0&&i<y)
{
s+=cnt1;
cnt1=0;
m10=MIN(i,x);
m1=MIN(i,w-x);
miy++;
for(j=-m10;j<m1;j++)
{
y5=0.3*imageinr[x+j][y-i]+0.59*imageing[x+j][y-i]+0.11*imageinb[x+j][y-i];
u5=-0.17*imageinr[x+j][y-i]-0.33*imageing[x+j][y-i]+0.5*imageinb[x+j][y-i];
v5=0.5*imageinr[x+j][y-i]-0.42*imageing[x+j][y-i]-0.08*imageinb[x+j][y-i];
fi=ABS(y5-y0);
fs=ABS(sqrt(u5*u5+v5*v5)-sqrt(u0*u0+v0*v0));
fh=(int)(100.0*ABS((u5*v0-v5*u0)/(u5*u0+v5*v0)));
double ss=100.0*ABS((u5*v0-v5*u0)/(float)(u5*u0+v5*v0));
if(fi<30&&fs<15&&fh<10)
{
cnt1++;
imageinr[x+j][y-i]=0;
imageing[x+j][y-i]=0;
imageinb[x+j][y-i]=0;
sx+=j;
sy+=-i;
}
}
if(cnt2>0&&i<w-x)
{
s+=cnt2;
cnt2=0;
m20=MIN(i,y);
m2=MIN(i,h-y);
max++;
for(j=-m20;j<m2;j++)
{
y5=0.3*imageinr[x+i][y+j]+0.59*imageing[x+i][y+j]+0.11*imageinb[x+i][y+j];
u5=-0.17*imageinr[x+i][y+j]-0.33*imageing[x+i][y+j]+0.5*imageinb[x+i][y+j];
v5=0.5*imageinr[x+i][y+j]-0.42*imageing[x+i][y+j]-0.08*imageinb[x+i][y+j];
fi=ABS(y5-y0);
fs=ABS(sqrt(u5*u5+v5*v5)-sqrt(u0*u0+v0*v0));
fh=(int)(100*ABS((u5*v0-v5*u0)/(u5*u0+v5*v0)));
if(fi<30&&fs<15&&fh<10)
{
cnt2++;
imageinr[x+i][y+j]=0;
imageing[x+i][y+j]=0;
imageinb[x+i][y+j]=0;
sx+=i;
sy+=j;
}
}
}
if(cnt3>0&&i<h-y)
{
s+=cnt3;
cnt3=0;
m30=MIN(i,w-x);
m3=MIN(i,x);
may++;
for(j=m30;j>-m3;j--)
{
y5=0.3*imageinr[x+j][y+i]+0.59*imageing[x+j][y+i]+0.11*imageinb[x+j][y+i];
u5=-0.17*imageinr[x+j][y+i]-0.33*imageing[x+j][y+i]+0.5*imageinb[x+j][y+i];
v5=0.5*imageinr[x+j][y+i]-0.42*imageing[x+j][y+i]-0.08*imageinb[x+j][y+i];
fi=ABS(y5-y0);
fs=ABS(sqrt(u5*u5+v5*v5)-sqrt(u0*u0+v0*v0));
fh=(int)(100*ABS((u5*v0-v5*u0)/(u5*u0+v5*v0)));
if(fi<30&&fs<15&&fh<10)
{
cnt3++;
imageinr[x+j][y+i]=0;
imageing[x+j][y+i]=0;
imageinb[x+j][y+i]=0;
sx+=j;
sy+=i;
}
}
}
if(cnt4>0&&i<x)
{
s+=cnt4;
cnt4=0;
m40=MIN(i,y-h);
m4=MIN(i,y);
mix++;
for(j=i;j>-i;j--)
{
y5=0.3*imageinr[x-i][y+j]+0.59*imageing[x-i][y+j]+0.11*imageinb[x-i][y+j];
u5=-0.17*imageinr[x-i][y+j]-0.33*imageing[x-i][y+j]+0.5*imageinb[x-i][y+j];
v5=0.5*imageinr[x-i][y+j]-0.42*imageing[x-i][y+j]-0.08*imageinb[x-i][y+j];
fi=ABS(y5-y0);
fs=ABS(sqrt(u5*u5+v5*v5)-sqrt(u0*u0+v0*v0));
fh=(int)(100*ABS((u5*v0-v5*u0)/(u5*u0+v5*v0)));
if(fi<30&&fs<15&&fh<10)
{
cnt4++;
imageinr[x-i][y+j]=0;
imageing[x-i][y+j]=0;
imageinb[x-i][y+j]=0;
sx+=-i;
sy+=j;
}
}
}
}
s-=4;
int mm=2*n;
if(s<1) s=1;
int xx=sx/s+x;
int yy=sy/s+y;
int mh=(miy+may)/2;
int mw=(mix+max)/2;
if((mw+xx)>mm) mw=mm-xx;
else if((xx-mw)<0) mw=xx;
if((mh+yy)>mm) mh=mm-yy;
else if((yy-mh)<0) mh=yy;
// *x_x=xx;
// *y_y=yy;
for(i=-mh;i<mh;i++)
for(j=-mw;j<mw;j++)
imageinr[j+xx][i+yy]=0;
imageing[j+xx][i+yy]=255;
imageinb[j+xx][i+yy]=0;
}
}
void CColorGrow::GetPoint(BYTE *pbyte, int w, int h, int imager0, int imageg0, int imageb0, DWORD width,DWORD index, int *x, int *y)
{
double y0,u0,v0,y5,u5,v5;
double fi,fs,fh;
double lasti,lasts,lasth;
int i,j;
y0=0.3*imager0+0.59*imageg0+0.11*imageb0;
u0=-0.17*imager0-0.33*imageg0+0.5*imageb0;
v0=0.5*imager0-0.42*imageg0-0.08*imageb0;
lasti=lasts=lasth=400;
for(i=0;i<h;i++)
{
BYTE* pbyRsc=pbyte+index;
for(j=0;j<w;j++)
{
BYTE* pbyBlue=pbyRsc++;
BYTE* pbyGreen=pbyRsc++;
BYTE* pbyRed=pbyRsc++;
// pbyRsc++;
int imageinr=(int)*pbyRed;
int imageing=(int)*pbyGreen;
int imageinb=(int)*pbyBlue;
y5=0.3*imageinr+0.59*imageing+0.11*imageinb;
u5=-0.17*imageinr-0.33*imageing+0.5*imageinb;
v5=0.5*imageinr-0.42*imageing-0.08*imageinb;
fi=ABS(y5-y0);
fs=ABS(sqrt(u5*u5+v5*v5)-sqrt(u0*u0+v0*v0));
fh=100.0*ABS((u5*v0-v5*u0)/(u5*u0+v5*v0));
if(fh<lasth)
{
lasth=fh;
*x=j;
*y=i;
}
else if(fs<lasts||fh<lasth+6)
{
lasth=fs;
*x=j;
*y=i;
}
else if(fi<lasti||fs<lasts+15||fh<lasth+10)
{
lasti=fi;
*x=j;
*y=i;
}
}
index+=width;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -