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

📄 globalfunc.cpp

📁 visual c++图像处理经典算法示例程序 把功能都集中在一个程序中
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{
				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 + -