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

📄 imgprocessing.cpp

📁 直方图的相关操作
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			if(temp>255) temp=255;
			buf=(BYTE)temp;
			img[i*imgwidth+j]=buf;
		}
}
/**********************************************/
/*  function for get symmetry of image region */
/*  img      : the  image                     */
/*  imgheight: height of image                */
/*  imgwidth : width of image                 */
/*  rect     : the rect                       */
/**********************************************/

double Img_GetSymmetry(CByteArray& img,int imgheight,int imgwidth,CRect &rect)
{
	int height=rect.Height();
	int width=rect.Width();
	int top=rect.top;
	int left=rect.left;
    int i,j;
	int time=0;
	double sym=0.0;
	for(i=0;i<height;i++)
		for(j=0;j<width/2;j++)
		{
			sym+=abs((img[(i+top)*imgwidth+left+j]-img[(i+top)*imgwidth+left+width-j-1]));
	        time++;
		}
	return sym/time;
 
}

bool Img_Seperate(CByteArray& oldimg,CByteArray& newimg,int imgheight,int imgwidth,CRect& rect)
{
	int height=rect.Height();   //刘 矩形区域的高度
	int width=rect.Width();     //刘 矩形区域的宽度
	int top=rect.top;           //刘 矩形区域左上角的坐标
	int left=rect.left;         //
	if ((top+height)>imgheight||(left+width)>imgwidth)
		return false;
 	newimg.RemoveAll();         
	newimg.SetSize(height*width);//设置?图像的大小为矩形的大小
	int i,j;
	for(i=0;i<height;i++)
		for(j=0;j<width;j++)
		{
			newimg[i*width+j]=oldimg[(top+i)*imgwidth+left+j];
		}
	return true;
}

int Img_Threshold(CByteArray& oldimg,int height,int width,int threshold)
{
	int num=0;
    int i,j;
	for(i=0;i<height;i++)
		for(j=0;j<width;j++)
		{
			if(oldimg[i*width+j]<threshold)
			{
				oldimg[i*width+j]=0;
                num++;
			}
			else 
			oldimg[i*width+j]=255;
		}
    return num;
}
void Img_Convert(CByteArray& oldimg,int height,int width)
{
	int i,j;
	for(i=0;i<height;i++)
		for(j=0;j<width;j++)
		{
			oldimg[i*width+j]=255-oldimg[i*width+j];
		}
}
void Img_Copy(CByteArray& oldimg,CByteArray& newimg)
{
	newimg.RemoveAll();
	int i,size=oldimg.GetSize();
	newimg.SetSize(size);
	for(i=0;i<size;i++)
	{
		newimg[i]=oldimg[i];
	}
}
double Img_MHausdorff(CImage& imga,CImage& imgb,int Nsize,int penalty,int delta)
{	
	int i,j,I,k,l;
	int awidth=imga.GetWidth();
	int bwidth=imgb.GetWidth();
	int aheight=imga.GetHeight();
	int bheight=imgb.GetHeight();
	double dis,disaB,disAB,disab;
    BYTE value;
	disAB=0.0;
	for(i=0;i<aheight;i++)
		for(j=0;j<awidth;j++)
		{
			value=imga.m_ImageBody[i*awidth+j];
	        I=0;			
			for(k=0;k<=Nsize;k++)
			{
				for(l=-k;l<=k;l++)
				{
					if((j+l>=0)&&(j+l<bwidth)&&(i+k>=0)&&(i+k<bheight)) 
					{
						if((value-imgb.m_ImageBody[(i+k)*bwidth+j+l])>-delta&&
							(value-imgb.m_ImageBody[(i+k)*bwidth+j+l])<delta)
						{
						    I=1;
						    disab=sqrt((double)k*k+l*l);
						    break;
						}
					}
					if((i+l>=0)&&(i+l<bheight)&&(j+k>=0)&&(j+k<bwidth))
					{
						if((value-imgb.m_ImageBody[(i+l)*bwidth+j+k])>-delta&&
							(value-imgb.m_ImageBody[(i+l)*bwidth+j+k])<delta)
						{
							I=1;
							disab=sqrt((double)k*k+l*l);
							break;
						}
					}
					if((i-k>=0)&&(i-k<bheight)&&(j+l>=0)&&(j+l<bwidth))
						if((value-imgb.m_ImageBody[(i-k)*bwidth+j+l])>-delta&&
							(value-imgb.m_ImageBody[(i-k)*bwidth+j+l])<delta)
						{
							I=1;
							disab=sqrt((double)k*k+l*l);
							break;
						}
					if((i+l>=0)&&(i+l<bheight)&&(j-k>=0)&&(j-k<bwidth))
						if((value-imgb.m_ImageBody[(i+l)*bwidth+j-k])>-delta&&
							(value-imgb.m_ImageBody[(i+l)*bwidth+j-k])<delta)
						{
							I=1;
							disab=sqrt((double)k*k+l*l);
							break;
						}
				}//for l
				if(I==1) break;
			}//for k
			if(I==0) 
			    disaB=penalty;
            else
				disaB=disab;
		   disAB+=disaB;
		}//for outer
		dis=disAB/(awidth*aheight);
		return dis;

}
double Img_Hausdorff(CImage& imga,CImage& imgb,int Nsize,int penalty)
{
	int i,j,I,k,l;
	int awidth=imga.GetWidth();
	int bwidth=imgb.GetWidth();
	int aheight=imga.GetHeight();
	int bheight=imgb.GetHeight();
	double dis,disaB,disAB,disab;
    BYTE value;
	disAB=0.0;
	for(i=0;i<aheight;i++)
		for(j=0;j<awidth;j++)
		{
			value=imga.m_ImageBody[i*awidth+j];
	        I=0;			
			for(k=0;k<=Nsize;k++)
			{
				for(l=-k;l<=k;l++)
				{
					if((j+l>=0)&&(j+l<bwidth)&&(i+k>=0)&&(i+k<bheight)) 
					{
						if(value==imgb.m_ImageBody[(i+k)*bwidth+j+l])
						{
						    I=1;
						    disab=sqrt((double)k*k+l*l);
						    break;
						}
					}
					if((i+l>=0)&&(i+l<bheight)&&(j+k>=0)&&(j+k<bwidth))
					{
						if(value==imgb.m_ImageBody[(i+l)*bwidth+j+k])
						{
							I=1;
							disab=sqrt((double)k*k+l*l);
							break;
						}
					}
					if((i-k>=0)&&(i-k<bheight)&&(j+l>=0)&&(j+l<bwidth))
						if(value==imgb.m_ImageBody[(i-k)*bwidth+j+l])
						{
							I=1;
							disab=sqrt((double)k*k+l*l);
							break;
						}
					if((i+l>=0)&&(i+l<bheight)&&(j-k>=0)&&(j-k<bwidth))
						if(value==imgb.m_ImageBody[(i+l)*bwidth+j-k])
						{
							I=1;
							disab=sqrt((double)k*k+l*l);
							break;
						}
				}//for l
				if(I==1) break;
			}//for k
			if(I==0) 
			    disaB=penalty;
            else
				disaB=disab;
		   disAB+=disaB;
		}//for outer
		dis=disAB/(awidth*aheight);
		return dis;
}
void Img_Laplace(CByteArray& oldimg,CByteArray& newimg,int height,int width)
{
	int i,j,c;
	newimg.SetSize(oldimg.GetSize());
	for(i=1;i<height-1;i++)
		for(j=1;j<width-1;j++)
		{
			c=-4*(int)(oldimg[i*width+j])+(int)(oldimg[(i-1)*width+j])+
				(int)(oldimg[(i+1)*width+j]);
			c+=((int)(oldimg[i*width+j-1])+(int)(oldimg[i*width+j+1]));
			if(c<0){
				c=0;
			}
			else if(c>255){
				c=255;
			}
			newimg[i*width+j]=(unsigned char)c;
		}
}
/*****************************************************************/
/* Name: Grass_label()			                                 */
/* Function: Subroutine Counting objects in a binary image.      */
/* Parameters:imga,imgb:input and output buffer.                 */
/*          N:number of regions                                  */
/*          h:buffers to store object areas.                     */
/*         NS:maximal allowable number of objects(less than 255).*/
/*****************************************************************/
int Grass_label(CByteArray& imga,CByteArray& imgb,
				int& N,DoubleArray& h,int& NS,CRect& rect,int Width)
{
	int i,j,number;
	imgb.SetSize(imga.GetSize());
	h.SetSize(NS);
	number=0;
	for(i=rect.top;i<rect.bottom&&number<NS;i++)
		for(j=rect.left;j<rect.right&&number<NS;j++)
			if(imga[i*Width+j]==0)
			{
				Grass(imga,imgb,i,j,number+1,h[number],rect,Width);
				number++;
			}

    N=number;
    return (0);
}
/*******************************************/
/*           Name: grass()                 */
/*Function:Subroutine to clear a binary    */
/*         object that starts at (row,col) */
/*Parameters:imga,imgb:input/output buffer */
/*           row,col:pixel coordinates.    */
/*           number:current object number  */
/*           *area:object area(in pixels)  */
/*           rect: region                  */
/*******************************************/
int Grass(CByteArray& imga,CByteArray& imgb,int row,int col,
		  int number,double& area,CRect& rect,int width)
{
	int i,j;
	imga[row*width+col]=255;
	imgb[row*width+col]=number;
	area++;
	for(i=-1;i<=1;i++)
		for(j=-1;j<=1;j++)
		  if((row+i)>+rect.top&&(row+i)<rect.bottom
			&&(col+j)>+rect.left&&(col+j)<rect.right)
			if(imga[(row+i)*width+col+j]==0)
				Grass(imga,imgb,row+i,col+j,number,area,rect,width);
    return (0);
}
void Img_Grow(CByteArray& imga,CPoint& point,int place)
{
}

/******************************************/
void Img_Uniform(CByteArray& img,int height,int width,CRect& rect)
{
	int center=width/2,i,j,left,right;
    for(i=rect.top;i<rect.bottom;i++)
		for(j=rect.left;j<rect.Width()/2;j++)
		{
			left=img[i*width+j];
			right=img[i*width+width-1-j];
			if(abs(left-right)>100)
			img[i*width+j]=img[i*width+width-j-1]
				=(UINT)((left+right)/2.0);
//			if(left<right)
//				img[i*width+j]=img[i*width+width-j-1]=left;
//			else 
//				img[i*width+j]=img[i*width+width-j-1]=right;
		}
}
double Img_GetCos(CByteArray& imga,CByteArray& imgb)
{
	double u=0.0,v=0.0,mul=0.0;
	int i;
	for(i=0;i<imga.GetSize();i++)
	{
		u+=(imga[i]*imga[i]);
		v+=(imgb[i]*imgb[i]);
		mul+=(imga[i]*imgb[i]);
	}
	u=sqrt(u);
	v=sqrt(v);
    return(mul/(u*v));
}
double Img_GetCos(DoubleArray& imga,DoubleArray& imgb)
{
	double u=0.0,v=0.0,mul=0.0;
	int i;
	for(i=0;i<imga.GetSize();i++)
	{
		double temp=imga[i];
		u+=((double)imga[i]*(double)imga[i]);
		v+=((double)imgb[i]*(double)imgb[i]);
		mul+=((double)imga[i]*(double)imgb[i]);
	}
	u=sqrt(u);
	v=sqrt(v);
    return(mul/(u*v));
}
double Img_GetCos(DoubleArray& imga,DoubleArray& imgb,int Num)
{
	double u=0.0,v=0.0,mul=0.0;
	int i;
	for(i=0;i<Num;i++)
	{
		double temp=imga[i];
		u+=((double)imga[i]*(double)imga[i]);
		v+=((double)imgb[i]*(double)imgb[i]);
		mul+=((double)imga[i]*(double)imgb[i]);
	}
	u=sqrt(u);
	v=sqrt(v);
    return(mul/(u*v));
}
double Img_GetCos(CByteArray& imga,CByteArray& imgb,int height,int width,CRect& rect)
{
	double u=0.0,v=0.0,mul=0.0;
	int i,j;
	int l=rect.left;
	int t=rect.top;
	int b=rect.bottom;
	int r=rect.right;
	for(i=t;i<b;i++)
		for(j=l;j<r;j++)
	{
		u+=(imga[i*width+j]*imga[i*width+j]);
		v+=(imgb[(i-t)*rect.Width()+j-l]*imgb[(i-t)*rect.Width()+j-l]);
		mul+=(imga[i*width+j]*imgb[(i-t)*rect.Width()+j-l]);
	}
	u=sqrt(u);
	v=sqrt(v);
    return(mul/(u*v));
}

void Img_UpDown(CByteArray& imga,CByteArray& imgb,int height,int width,int newheight,int y0,double theta)
{
	double x1,y1;
	int i,j,a,b;
	int newwidth;
	double costh=cos(theta);
	//newheight=height*costh;
	newwidth=width;
	int y00=(int)(y0*cos(theta));
	imgb.SetSize(newheight*newwidth);
	for(i=0;i<newheight;i++)
		for(j=0;j<newwidth;j++)
		{
			x1=j;
			y1=y00+(double)(i-y00)/costh;
	        a=(int)y1,b=a+1;
			if(a<0) a=0;
			if(b>=height) b=height-1;
			imgb[i*newwidth+j]=(int)(imga[a*newwidth+j]*(b-y1)+imga[b*newwidth+j]*(y1-a));
		}
}
void Img_Projection(DoubleArray& data,DoubleArray& pm,int dim,int Num,DoubleArray& cf)
{
	int i,j;
	double buf;
	cf.SetSize(Num);
	for(i=0;i<Num;i++)
	{
		buf=0.0;
		for(j=0;j<dim;j++)
		{
			buf+=(data[j]*pm[j*240+i]);//150--yale,240--orl
		}
		cf[i]=buf;
	}

}
void Img_Denoise(CByteArray& imga,CByteArray& imgb,int height,int width)
{
	int i,j,m,n;
    imgb.RemoveAll();
	imgb.SetSize(height*width);
/* 	for(i=0;i<height;i++)
		for(j=0;j<width;j++)
		{
			if(i==0||j==0||i=height-1||j=width-1)
			{
			    imgb[i*width+j]=imga[i*width+j];
				continue;
			}
			cc=+(int)imga[(i-1)*width+(j-1)]
				+1*(int)imga[(i)*width+(j-1)]
				+(int)imga[(i+1)*width+(j-1)];
			cc+=(int)imga[(i-1)*width+(j+1)]
				+1*(int)imga[(i)*width+(j+1)]
				+(int)imga[(i+1)*width+(j+1)];
			cc+=1*(int)imga[(i-1)*width+j]
				+2*(int)imga[(i)*width+j]
				+1*(int)imga[(i+1)*width+j];
			c=cc/10;
			imgb[i*width+j]=(BYTE)c;
		}
		*/
	int block=2;
	for(i=0;i<height;i++)
		for(j=0;j<width;j++)
		{
			for(m=i;m<i+block;m++)
				for(n=j;n<j+block;n++)
				{
				}
		}
}
bool WriteArcFile(CString& str,DoubleArray& cf)
{
    CFile file;
	if(file.Open(str,CFile::modeCreate|CFile::modeWrite)==NULL)
	{
		AfxMessageBox("写向量错误");
		return false;
	}
	CArchive ar(&file,CArchive::store);
	cf.Serialize(ar);
	return true;
}
bool ReadArcFile(CString& str,DoubleArray& cf)
{
    CFile file;
	if(file.Open(str,CFile::modeRead)==NULL)
	{
		AfxMessageBox("读向量错误");
		return false;
	}
	CArchive ar(&file,CArchive::load);
	cf.Serialize(ar);
	return true;
}
bool ReadArcFile(CString& str,CByteArray& cf)
{
    CFile file;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -