📄 globalfunc.cpp
字号:
{
if(k+org>=0&&k+org<imgWidth)
{
tmp=sin((k*mAngle+sita)/2);
judge=2*tmp*tmp-delta;
dDis[k]=judge/bowLen*count+0.5;
//计算映射表
if(clrNum==1)
{
if(org+dDis[k]<0||org+dDis[k]>imgWidth)
*(lpOut+i*lineByte+org+k)=0;
else
*(lpOut+i*lineByte+org+k)=*(lpTmp+i*lineByte+org+
(int)dDis[k]);
}else
{
if(org+dDis[k]<0||org+dDis[k]>imgWidth)
{
*(lpOut+i*lineByte+3*(org+k))=0;
*(lpOut+i*lineByte+3*(org+k)+1)=0;
*(lpOut+i*lineByte+3*(org+k)+2)=0;
}else
{
*(lpOut+i*lineByte+3*(org+k))=*(lpTmp+i*lineByte+
3*(org+(int)dDis[k]));
*(lpOut+i*lineByte+3*(org+k)+1)=*(lpTmp+i*lineByte+
3*(org+(int)dDis[k])+1);
*(lpOut+i*lineByte+3*(org+k)+2)=*(lpTmp+i*lineByte+
3*(org+(int)dDis[k])+2);
}
}
//修改相应的像素值
}
}
}
}
}
void ConvertTwo(LPBYTE lpIn,LPBYTE lpOut,int imgWidth,int imgHeight,int threshold)
//转为二值图像--目前用一刀切,其它方法慢慢加
{
int i,j;
int lineByte=(imgWidth+3)/4*4;
int dis;
for(i=0;i<imgHeight;i++)
{
for(j=0;j<lineByte;j++)
{
dis=i*lineByte+j;
if(*(lpIn+dis)<threshold)
{
*(lpOut+dis)=0;
}else
{
*(lpOut+dis)=255;
}
}
}
}
void RowMean(LPBYTE lpIn,LPBYTE lpOut,int imgWidth,int imgHeight)
//行均值相减
{
int i,j;
int lineByte=(imgWidth+3)/4*4;
int rowSum,rowMean,tmp,position;
for(i=0;i<imgHeight;i++)
{
if(i!=0)
{
rowMean=rowSum/imgWidth;
}
rowSum=0;
for(j=0;j<imgWidth;j++)
{
position=i*lineByte+j;
if(i!=0)
{
tmp=*(lpIn+position)-rowMean+100;
if(tmp<0)
tmp=0;
if(tmp>255)
tmp=255;
*(lpOut+position)=tmp;
}
rowSum+=*(lpIn+position);
}
}
}
void ReverseClr(LPBYTE lpIn,LPBYTE lpOut,int imgWidth,int imgHeight,int clr)
//反色
{
int i,j;
int lineByte=(imgWidth*clr+3)/4*4;
for(i=0;i<imgHeight;i++)
{
for(j=0;j<lineByte;j++)
{
*(lpOut+i*lineByte+j)=255-*(lpIn+i*lineByte+j);
}
}
}
void ConvertGray(LPBYTE lpIn,LPBYTE lpOut,int imgWidth,int imgHeight)
//24位RGB-->8位灰度图
{
int i,j;
int lineByte1=(imgWidth +3)/4*4,
lineByte3=(imgWidth*3+3)/4*4;
LPBYTE point;
double Y;
for(i=0;i<imgHeight;i++)
{
for(j=0;j<imgWidth;j++)
{
point=lpIn+i*lineByte3+3*j;
Y=0.299*(double)*(point+2)+0.587*(double)*(point+1)
+0.114*(double)*point+0.1;
*(lpOut+i*lineByte1+j)=(BYTE)Y;
}
}
}
void NearNeighbor(LPBYTE lpIn,LPBYTE lpOut,int imgWidth,int imgHeight,int clrNum,float zoom)
//最近邻缩放
{
int i,j;
int heightNew=(int)(imgHeight*zoom),widthNew=(int)(imgWidth*zoom);
int lineByte=(imgWidth*clrNum+3)/4*4,lineByteNew=(widthNew*clrNum+3)/4*4;
int xPos,yPos;
for(i=0;i<heightNew;i++)
{
for(j=0;j<widthNew;j++)
{
yPos=(int)(i/zoom+0.5);
xPos=(int)(j/zoom+0.5);
if(xPos>=imgWidth)
xPos=imgWidth-1;
if(yPos>=imgHeight)
yPos=imgHeight-1;
if(clrNum==1)
{
*(lpOut+i*lineByteNew+j)=*(lpIn+yPos*lineByte+xPos);
}else
{
*(lpOut+i*lineByteNew+3*j )=*(lpIn+yPos*lineByte+3*xPos);
*(lpOut+i*lineByteNew+3*j+1)=*(lpIn+yPos*lineByte+3*xPos+1);
*(lpOut+i*lineByteNew+3*j+2)=*(lpIn+yPos*lineByte+3*xPos+2);
}
}
}
}
void BilinearIn(LPBYTE lpIn,LPBYTE lpOut,int imgWidth,int imgHeight,int clrNum,float zoom)
//双线性插值
{
int i,j,k;
int heightNew=(int)(imgHeight*zoom),widthNew=(int)(imgWidth*zoom);
int lineByte=(imgWidth*clrNum+3)/4*4,lineByteNew=(widthNew*clrNum+3)/4*4;
double xTmp,yTmp,f00,f01,f10,f11,gray,xDelta,yDelta;
int xn,yn;
if(clrNum==1)
{
for(i=0;i<heightNew;i++)
{
for(j=0;j<widthNew;j++)
{
xTmp=j/zoom;
yTmp=i/zoom;
xn=(int)xTmp;
yn=(int)yTmp;
xDelta=(xTmp-xn);
yDelta=(yTmp-yn);
f00=*(lpIn+yn*lineByte+xn);
f01=*(lpIn+(yn+1)*lineByte+xn);
f10=*(lpIn+yn*lineByte+xn+1);
f11=*(lpIn+(yn+1)*lineByte+xn+1);
gray=f00+(f10-f00)*xDelta+(f01-f00)*yDelta+
(f11+f00-f01-f10)*xDelta*yDelta+0.5;
*(lpOut+i*lineByteNew+j)=(int)gray;
}
}
}else
{
for(i=0;i<heightNew;i++)
{
for(j=0;j<widthNew;j++)
{
xTmp=j/zoom;
yTmp=i/zoom;
xn=(int)xTmp;
yn=(int)yTmp;
xDelta=(xTmp-xn);
yDelta=(yTmp-(int)yTmp);
for(k=0;k<3;k++)
{
f00=*(lpIn+yn*lineByte+xn*3+k);
f01=*(lpIn+(yn+1)*lineByte+xn*3+k);
f10=*(lpIn+yn*lineByte+(xn+1)*3+k);
f11=*(lpIn+(yn+1)*lineByte+(xn+1)*3+k);
gray=f00+(f10-f00)*xDelta+(f01-f00)*yDelta+
(f11+f00-f01-f10)*xDelta*yDelta+0.5;
*(lpOut+i*lineByteNew+j*3+k)=(int)gray;
}
}
}
}
}
double InterPolation(double x,double *xsh)//sinc(x)函数的三次多项式逼近
{
double sum=0;
double x2=x*x;
double x3=x2*x;
sum=(xsh[3]-xsh[2]+xsh[1]-xsh[0])*x3;
sum-=(xsh[3]-xsh[2]+2*(xsh[1]-xsh[0]))*x2;
sum+=(xsh[2]-xsh[0])*x+xsh[1];
return sum;
}
void CubeCovolution(LPBYTE lpIn,LPBYTE lpOut,int imgWidth,int imgHeight,int clrNum,float zoom)
// 立方卷积缩放
{
int i,j,k,l,n;
int heightNew=(int)(imgHeight*zoom),widthNew=(int)(imgWidth*zoom);
int lineByte=(imgWidth*clrNum+3)/4*4,lineByteNew=(widthNew*clrNum+3)/4*4;
double xTmp,yTmp,xDelta,yDelta,gray;
double xsh1[4],xsh2[4];
int xn,yn,xnTmp,ynTmp;
if(clrNum==1)
{
for(i=1;i<heightNew-2;i++)
{
for(j=1;j<widthNew-2;j++)
{
xTmp=j/zoom;
yTmp=i/zoom;
xn=(int)xTmp;
yn=(int)yTmp;
xDelta=(xTmp-xn);
yDelta=(yTmp-yn);
for(k=-1;k<3;k++)
{
for(l=-1;l<3;l++)
{
xnTmp=xn+k;
ynTmp=yn+l;
if(ynTmp<0)
ynTmp=0;
else if(xnTmp<0)
xnTmp=0;
else if(yn>=imgHeight)
ynTmp=imgHeight-1;
else if(xnTmp>=imgWidth)
ynTmp=imgWidth-1;
xsh1[l+1]=*(lpIn+ynTmp*lineByte+xnTmp);
}
xsh2[k+1]=InterPolation(yDelta,xsh1);
}
gray=(int)InterPolation(xDelta,xsh2);
if(gray<0)
gray=0;
else if(gray>255)
gray=255;
*(lpOut+i*lineByteNew+j)=(int)gray;
}
}
}else
{
for(i=1;i<heightNew-2;i++)
{
for(j=1;j<widthNew-2;j++)
{
xTmp=j/zoom;
yTmp=i/zoom;
xn=(int)xTmp;
yn=(int)yTmp;
xDelta=(xTmp-xn);
yDelta=(yTmp-yn);
for(n=0;n<3;n++)
{
for(k=-1;k<3;k++)
{
for(l=-1;l<3;l++)
{
xnTmp=xn+k;
ynTmp=yn+l;
if(ynTmp<0)
ynTmp=0;
else if(xnTmp<0)
xnTmp=0;
else if(yn>=imgHeight)
ynTmp=imgHeight-1;
else if(xnTmp>=imgWidth)
ynTmp=imgWidth-1;
xsh1[l+1]=*(lpIn+ynTmp*lineByte+xnTmp*3+n);
}
xsh2[k+1]=InterPolation(yDelta,xsh1);
}
gray=(int)InterPolation(xDelta,xsh2);
if(gray<0)
gray=0;
else if(gray>255)
gray=255;
*(lpOut+i*lineByteNew+j*3+n)=(int)gray;
}
}
}
}
}
void GeometryRecify(LPBYTE lpIn,LPBYTE lpOut,int imgWidth,int imgHeight)
{
int i,j,k;
/********************最小二乘法求变换系数K1,K2*********************/
double sum;
double U[7][6],M[6][6];
double u[7]={98,68,253,120,326,381,510},v[7]={450,372,339,201,182,115,421};
double x[7]={298,386,292,498,369,384,51},y[7]={30,72,227,225,387,476,375};
for(i=0;i<7;i++)//matrix U
{
U[i][0]=1;
U[i][1]=u[i];
U[i][2]=v[i];
U[i][3]=u[i]*u[i];
U[i][4]=v[i]*v[i];
U[i][5]=u[i]*v[i];
}
for(i=0;i<6;i++)//matrix UT*U
{
for(j=0;j<6;j++)
{
sum=0;
for(k=0;k<7;k++)
sum+=U[k][i]*U[k][j];
M[i][j]=sum;
}
}
/*******************************************************************************/
//k1=M-1*UT*x k2=M-1*UT*y
//矩阵求逆好麻烦,用Matlab算出结果
double k1[6]={751.8484,-0.7165,-0.8433, -0.0000397,-0.0000584,0.0001877};
double k2[6]={261.0038,0.6170,-0.4973,0.0002856,-0.00033934,-0.000025157};
int lineByte=(imgWidth*3+3)/4*4;
double xNew,yNew;
int xInt,yInt;
for(i=0;i<imgHeight;i++)
{
for(j=0;j<imgWidth;j++)
{
xNew=k1[0]+k1[1]*j+k1[2]*i+k1[3]*j*j+k1[4]*i*i+k1[5]*i*j;
yNew=k2[0]+k2[1]*j+k2[2]*i+k2[3]*j*j+k2[4]*i*i+k2[5]*i*j;
xInt=(int)xNew;
yInt=(int)yNew;
if(xInt<0||yInt<0||xInt>=imgWidth||yInt>=imgHeight)
continue;
for(k=0;k<3;k++)
*(lpOut+i*lineByte+j*3+k)=*(lpIn+yInt*lineByte+xInt*3+k);
}
}
}
void FFT(complex<double> * TD, complex<double> * FD, int power)
//基2时域抽取蝶形流图算法(一维)
{
int i,j,k;
int tmp,size;
double angle;
LONG count=1<<power;
complex<double> *W,*M,*X;
W=new complex<double>[count/2];//权值
M=new complex<double>[count];
angle=2*pai/count; //旋转因子的基数角度
for(i=0;i<count/2;i++)
W[i]=complex<double>(cos(-i*angle),sin(-i*angle));
for(k=0;k<power;k++)
{
for(j=0;j<1<<k;j++)
{
size=1<<(power-k);
for(i=0;i<size/2;i++)
{
tmp=j*size;
//蝶形算法
M[i+tmp]=TD[i+tmp]+TD[i+tmp+size/2];
M[i+tmp+size/2]=(TD[i+tmp]-TD[i+tmp+size/2])*W[i*(1<<k)];
}
}
//交换地址
X=TD;
TD=M;
M=X;
}
//对码位倒序重新排序
for(i=0;i<count;i++)
{
tmp=0;
//重新排序
for(j=0;j<power;j++)
{
if(i&(1<<j))
tmp+=1<<(power-j-1);
}
//排序结果
FD[i]=TD[tmp];
}
delete W;
delete M;
}
void IFFT(complex<double> * FD, complex<double> * TD, int power)
//逆变换得蝶形流图算法(一维)
{
int i;
LONG count=1<<power;
//求共轭
for(i=0;i<count;i++)
FD[i]=complex<double>(FD[i].real(),-FD[i].imag());
//调用蝶形算法
FFT(FD,TD,power);
for(i=0;i<count;i++)
TD[i]=complex<double>(TD[i].real()/count,-TD[i].imag()/count);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -