📄 colorgrow.cpp
字号:
// ColorGrow.cpp: implementation of the CColorGrow class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ColorGrow.h"
#include "math.h"
#include "Img.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define ABS(x) (((x) < 0) ? -(x) : (((x) > 0) ? (x) : 0))
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CColorGrow,CImagePointProcess)
CColorGrow::CColorGrow()
{
}
CColorGrow::~CColorGrow()
{
}
#ifdef _DEBUG
void CColorGrow::Dump(CDumpContext& dc)const
{
CImagePointProcess::Dump(dc);
}
void CColorGrow::AssertValid()const
{
CImagePointProcess::AssertValid();
}
#endif
static int imagein_r[200][200];
static int imagein_g[200][200];
static int imagein_b[200][200];
static int mm_x[2];
static int mm_y[2];
BOOL CColorGrow::GetImage(LPBYTE lpbyBits32, int* xx, int* yy, int nWidth, int nHeight, int nScanWidth, int nScanHeight,int* R, int* G,int* B)
{
ASSERT(lpbyBits32);
if((*xx>(nScanWidth-1))||(*yy>(nScanHeight-1))) return FALSE;
int dx,dy,xw,yh,dw,dh,x0,y0;
int i,j;
int x,y;
int r,g,b,rgb;
int rgbmin=1000;
x=*xx;
y=*yy;
DWORD dwWidthBytes=(DWORD)((nWidth*24+31)/32)*4;
if(*R>-1)
{
dx=x-20;
dy=y-20;
dw=nWidth-x;
dh=nHeight-y;
if(dx<0) { dx=0;x0=x;xw=x+20;}
else if(dw<20)
{
x0=20;xw=dw+20;
}
else
{
x0=20;xw=40;
}
if(dy<0) { dy=0;y0=y;yh=y+20;}
else if(dh<20)
{y0=20;yh=dh+20;}
else {y0=20;yh=40;}
// DWORD dwWidthBytes=(DWORD)((nWidth*24+31)/32)*4;
DWORD dwBaseIndex=dy*dwWidthBytes+3*dx;
int imager0=*R;
int imageg0=*G;
int imageb0=*B;
x=mm_x[1]+mm_x[0];
y=mm_y[1]+mm_y[0];
for(i=0;i<yh;i++)
{
BYTE* pbyRsc=lpbyBits32+dwBaseIndex;
for(j=0;j<xw;j++)
{
BYTE* pbyBlue=pbyRsc++;
BYTE* pbyGreen=pbyRsc++;
BYTE* pbyRed=pbyRsc++;
// pbyRsc++;
int r=ABS((int)*pbyRed-(int)(*R));
int g=ABS((int)*pbyGreen-(int)(*G));
int b=ABS((int)*pbyBlue-(int)(*B));
if(r==0) r=1;
if(g==0) g=1;
if(b==0) b=1;
rgb=r*g*b+r+g+b;
if(rgb<rgbmin)
{
rgbmin=rgb;
x=j+dx;
y=i+dy;
}
}
dwBaseIndex+=dwWidthBytes;
}
}
else
{
mm_x[0]=x;
mm_y[0]=y;
}
mm_x[1]=x-mm_x[0];
mm_x[1]=y-mm_y[0];
mm_x[0]=x;
mm_y[0]=y;
dx=x-20;
dy=y-20;
dw=nWidth-x;
dh=nHeight-y;
if(dx<0) { dx=0;x0=x;xw=x+20;}
else if(dw<20)
{
x0=20;xw=dw+20;
}
else
{
x0=20;xw=40;
}
if(dy<0) { dy=0;y0=y;yh=y+20;}
else if(dh<20)
{y0=20;yh=dh+20;}
else {y0=20;yh=40;}
// DWORD dwWidthBytes=(DWORD)((nWidth*24+31)/32)*4;
DWORD dwBaseIndex=dy*dwWidthBytes+3*dx;
for(i=0;i<yh;i++)
{
BYTE* pbyRsc=lpbyBits32+dwBaseIndex;
for(j=0;j<xw;j++)
{
BYTE* pbyBlue=pbyRsc++;
BYTE* pbyGreen=pbyRsc++;
BYTE* pbyRed=pbyRsc++;
// pbyRsc++;
r=*pbyRed;
g=*pbyGreen;
b=*pbyBlue;
// BYTE gray=(BYTE)(((WORD)r*30+(WORD)g*59+(WORD)b*11)/100);
imagein_r[j][i]=r;
imagein_g[j][i]=g;
imagein_b[j][i]=b;
}
dwBaseIndex+=dwWidthBytes;
}
Grow(imagein_r,imagein_g,imagein_b,&x0,&y0,xw,yh,R,G,B);
// Grow2(imagein_r,imagein_g,imagein_b,&x0,&y0,xw,yh,R,G,B);
*xx=x0+dx;
*yy=y0+dy;
dwBaseIndex=dy*dwWidthBytes+3*dx;
for(i=0;i<yh;i++)
{
BYTE* lpby=lpbyBits32+dwBaseIndex;
for(j=0;j<xw;j++)
{
BYTE* pbyBlue=lpby++;
BYTE* pbyGreen=lpby++;
BYTE* pbyRed=lpby++;
// lpby++;
*pbyBlue=(BYTE)imagein_b[j][i];
*pbyGreen=(BYTE)imagein_g[j][i];
*pbyRed=(BYTE)imagein_r[j][i];
// *pbyBlue=(BYTE)0;
// *pbyGreen=(BYTE)0;
// *pbyRed=(BYTE)0;
}
dwBaseIndex+=dwWidthBytes;
}
return TRUE;
}
void CColorGrow::Grow(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)
{
int i,j,cnt1,cnt2,cnt3,cnt4;
/* int xy5r,xy5g,xy5b;
int xy2r,xy2g,xy2b;
int xy4r,xy4g,xy4b;
int xy6r,xy6g,xy6b;
int xy8r,xy8g,xy8b;*/
double y0,u0,v0;
double y5,u5,v5;
// int y2,u2,v2;
// int y4,u4,v4;
// int y6,u6,v6;
// int y8,u8,v8;
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];
*R=imager0;
*G=imageg0;
*B=imageb0;
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;
// y0=0.3*imageinr[x][y]+0.59*imageing[x][y]+0.11*imageinb[x][y];
// u0=-0.17*imageinr[x][y]-0.33*imageing[x][y]+0.5*imageinb[x][y];
// v0=0.5*imageinr[x][y]-0.42*imageing[x][y]-0.08*imageinb[x][y];
for(i=1;i<20;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++)
{
// xy5r=imageinr[x+j][y-i]-imageinr[x][y];
// xy5g=imageing[x+j][y-i]-imageing[x][y];
// xy5b=imageinb[x+j][y-i]-imageinb[x][y];
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];
// 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);
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)));
if(fi<30&&fs<15&&fh<10)
{
cnt1++;
// imageinr[x+j][y-i]=255-imager0;
// imageing[x+j][y-i]=255-imageg0;
// imageinb[x+j][y-i]=255-imageb0;
imageinr[x+j][y-i]=0;
imageing[x+j][y-i]=0;
imageinb[x+j][y-i]=0;
sx+=j;
sy+=-i;
// if(j<mix) mix=j;
// if(j>max) max=j;
// if(i<miy) miy=-i;
// if(i>may) may=-i;
}
/* else
{
xy2r=imageinr[x+j][y-i-1]-imageinr[x][y];
xy2g=imageing[x+j][y-i-1]-imageing[x][y];
xy2b=imageinb[x+j][y-i-1]-imageinb[x][y];
xy4r=imageinr[x+j-1][y-i]-imageinr[x][y];
xy4g=imageing[x+j-1][y-i]-imageing[x][y];
xy4b=imageinb[x+j-1][y-i]-imageinb[x][y];
xy6r=imageinr[x+j+1][y-i]-imageinr[x][y];
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(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++)
{
// 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)
{
cnt2++;
// 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++;
}
}*/
}
}
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--)
{
// xy5r=imageinr[x+j][y+i]-imageinr[x][y];
// xy5g=imageing[x+j][y+i]-imageing[x][y];
// xy5b=imageinb[x+j][y+i]-imageinb[x][y];
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)));
// 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)
{
cnt3++;
// imageinr[x+j][y+i]=255-imager0;
// imageing[x+j][y+i]=255-imageg0;
// imageinb[x+j][y+i]=255-imageb0;
imageinr[x+j][y+i]=0;
imageing[x+j][y+i]=0;
imageinb[x+j][y+i]=0;
sx+=j;
sy+=i;
/* if(j<mix) mix=j;
if(j>max) max=j;
if(i<miy) miy=i;
if(i>may) may=i;*/
}
/* else
{
xy2r=imageinr[x+j][y+i-1]-imageinr[x][y];
xy2g=imageing[x+j][y+i-1]-imageing[x][y];
xy2b=imageinb[x+j][y+i-1]-imageinb[x][y];
xy4r=imageinr[x+j-1][y+i]-imageinr[x][y];
xy4g=imageing[x+j-1][y+i]-imageing[x][y];
xy4b=imageinb[x+j-1][y+i]-imageinb[x][y];
xy6r=imageinr[x+j+1][y+i]-imageinr[x][y];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -