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

📄 imagecodesdoc.cpp

📁 VC写的harris角点检测程序。又名plessey
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  convoflag=TRUE;
}

void CImageCodesDoc::OnProcessMaxl()//局部最大类间方差 
{
	// TODO: Add your command handler code here
 label=false;
 if(Grayflag==false) Gray();
 unsigned int i,j,ri,cj,temp[50][50],T;

 ::SetCursor(mHWait);
 
 for(ri=0;ri<r0-50;ri+=50)//模块大小为50×50
 {
	 for(cj=0;cj<c0-50;cj+=50)
	 {
		 for(i=ri;i<ri+50;i++)
			 for(j=cj;j<cj+50;j++)
			    temp[i-ri][j-cj]=GrayValue[i][j];
	
		T=MaxClass(temp);//用最大类间方差求取50×50个像素的阈值

		 for(i=ri;i<ri+50;i++)
			 for(j=cj;j<cj+50;j++)
				 if(GrayValue[i][j]>T)
					 convo[i][j]=255;
				 else
					 convo[i][j]=0;
	 }
	 if(cj<c0)//如果列不是50的整数倍,就用当前T对剩余列进行划分
		 for(i=ri;i<ri+50;i++)
			 for(j=cj;j<c0;j++)
				 if(GrayValue[i][j]>T)
					 convo[i][j]=255;
				 else
					 convo[i][j]=0;
 }
 if(ri<r0)//如果行不是50的整数倍,就用当前T对剩余行进行划分
	 for(i=ri;i<r0;i++)
		 for(j=0;j<c0;j++)
			 if(GrayValue[i][j]>T)
				convo[i][j]=255;
			 else
				convo[i][j]=0;

 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);
 convoflag=TRUE;

 ::SetCursor(mHArrow);
}

void CImageCodesDoc::OnUpdateProcessMaxl(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
		pCmdUI->Enable(trans!=NULL);
}

void CImageCodesDoc::ProcessMaxl1() //对当前图用最大类间方差求取阈值,并进行分割
{	
if(convoflag==false) CopyGrayValueToConvo(); 
 erflag=TRUE;
 unsigned int i,j,n[256],GrayColor,t,T,temp,N;
 double p[256],w1,w2,u1,u2,d1,d2,dt,dw,at;
 double Db,MaxDb;
 for(i=0;i<256;i++)
  n[i]=0;

 t=T=0;
 Db=MaxDb=dt=dw=at=0.0;
 temp=0;
 for(i=1;i<r0-1;i++)
  for(j=1;j<c0-1;j++)
  { 
    temp=convo[i][j];
    n[temp]++;
  }
 //统计n[i]
 for(i=0;i<256;i++)
  N=N+n[i];
 //统计N
for(i=0;i<256;i++)
  p[i]=(double)(n[i])/(double)(N);
 //统计p[i]
 for(t=0;t<256;t++)
 {
  w1=0.0;
  for(i=0;i<=t;i++)
   w1=w1+p[i];
  w2=0.0;
  for(i=t+1;i<256;i++)
   w2=w2+p[i];
  u1=0.0;
  for(i=0;i<=t;i++)
   u1=u1+i*p[i];
  u2=0.0;
  for(i=t+1;i<256;i++)
   u2=u2+i*p[i];
  
  if(w1==0) w1=0.00001;//防止除零
  if(w2==0) w2=0.00001;//防止除零

  u1=u1/w1;
  u2=u2/w2;

  d1=0.0;
  for(i=0;i<=t;i++)
   d1=d1+(i-u1)*(i-u1)*p[i];
  d2=0.0;
  for(i=t+1;i<256;i++)
   d2=d2+(i-u2)*(i-u2)*p[i];
  
  d1/=w1;
  d2/=w2;
  dw=w1*d1*d1+w2*d2*d2;
  Db=w1*w2*(u1-u2)*(u1-u2);
  dt=Db+dw;
  at=Db/dt;
  
 //计算类间方差Db
  if(at>MaxDb)
  {
	  MaxDb=at;
      T=t;
   }

 }
 //求出阈值T
  convoflag=TRUE;
 for(i=1;i<r0-1;i++)
  for(j=1;j<c0-1;j++)
  {
	  if(convo[i][j]<T) 
		  GrayColor=0;
      else 
		  GrayColor=255;
   GrayValue[i][j]=GrayColor;
   }
CopyGVToConvo();
Grayflag=false;
}
void CImageCodesDoc::OnProcessMaxl1() 
{
	// TODO: Add your command handler code here
 label=TRUE;
 ProcessMaxl1();//对当前图进行阈值分割
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);

	::SetCursor(mHArrow);	
}

void CImageCodesDoc::OnUpdateProcessMaxl1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
		pCmdUI->Enable(trans!=NULL);
}

void CImageCodesDoc::OnXingH() //对原始图用水平算子进行腐蚀
{
	// TODO: Add your command handler code here
	label=false;
	unsigned int r,c;
	ProcessMaxl();//先用最大类间方差算法对原图二值化

	for(r=0;r<r0;r++)
		for(c=1;c<c0-1;c++)
		{
			GrayValue[r][c]=0;//先把当前点赋成黑色
			if(convo[r][c-1]==255||convo[r][c]==255||convo[r][c+1]==255)
				GrayValue[r][c]=255;//模板下只要有一个点为白色,就把当前点置成白色
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);

}

void CImageCodesDoc::OnXingV() //对原始图用垂直算子进行腐蚀
{
	// TODO: Add your command handler code here
	label=false;
	unsigned int r,c;
	ProcessMaxl();

	for(r=1;r<r0-1;r++)
		for(c=0;c<c0;c++)
		{
			GrayValue[r][c]=0;
			if(convo[r-1][c]==255||convo[r][c]==255||convo[r+1][c]==255)
				GrayValue[r][c]=255;
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);
	
}

void CImageCodesDoc::OnXingFang()//对原始图用方形算子进行腐蚀 
{
	// TODO: Add your command handler code here
	label=false;
	unsigned int r,c,i,j;
	BOOL breakflag=false;
	ProcessMaxl();

	for(r=0;r<r0-2;r++)
		for(c=0;c<c0-2;c++)
		{
			GrayValue[r+1][c+1]=0;
			for(i=0;i<3;i++)
			{	for(j=0;j<3;j++)
				     if(convo[r+i][c+j]==255)
					 {GrayValue[r+1][c+1]=255;breakflag=TRUE;break;}
				if(breakflag==TRUE) break;
			}
			breakflag=false;
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);
}

void CImageCodesDoc::OnUpdateXingFang(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);
}

void CImageCodesDoc::OnUpdateXingH(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);
}

void CImageCodesDoc::OnUpdateXingV(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);
}

void CImageCodesDoc::OnXingH1()//对当前图进行水平腐蚀 
{
	// TODO: Add your command handler code here
	label=TRUE;
	unsigned int r,c;
	xingflag=TRUE;
	if(erflag==false)
	  ProcessMaxl1();
	for(r=0;r<r0;r++)
		for(c=1;c<c0-1;c++)
		{
			GrayValue[r][c]=0;
			if(convo[r][c-1]==255||convo[r][c]==255||convo[r][c+1]==255)
				GrayValue[r][c]=255;
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);	
}

void CImageCodesDoc::OnXingFang1() //对当前图进行方形腐蚀
{
	// TODO: Add your command handler code here
	label=TRUE;
	BOOL breakflag=false;
	unsigned int r,c,i,j;
	xingflag=TRUE;
	if(erflag==false)
	  ProcessMaxl1();
 	for(r=0;r<r0-2;r++)
		for(c=0;c<c0-2;c++)
		{
			GrayValue[r+1][c+1]=0;
			for(i=0;i<3;i++)
			{	for(j=0;j<3;j++)
				     if(convo[r+i][c+j]==255)
					 {GrayValue[r+1][c+1]=255;breakflag=TRUE;break;}
				if(breakflag==TRUE) break;
			}
			breakflag=false;
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);		
}

void CImageCodesDoc::OnXingV1() //对当前图进行垂直腐蚀
{
	// TODO: Add your command handler code here
	label=TRUE;
	unsigned int r,c;
	xingflag=TRUE;
	if(erflag==false)
	  ProcessMaxl1();
     for(r=1;r<r0-1;r++)
		for(c=0;c<c0;c++)
		{
			GrayValue[r][c]=0;
			if(convo[r-1][c]==255||convo[r][c]==255||convo[r+1][c]==255)
				GrayValue[r][c]=255;
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);	
}

void CImageCodesDoc::OnUpdateXingFang1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);
}

void CImageCodesDoc::OnUpdateXingH1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
   pCmdUI->Enable(trans!=NULL);	
}

void CImageCodesDoc::OnUpdateXingV1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);
}

void CImageCodesDoc::OnPengH()//对原始图进行水平膨胀
{
	// TODO: Add your command handler code here
	label=false;
	unsigned int r,c;
	ProcessMaxl();

	for(r=0;r<r0;r++)
		for(c=1;c<c0-1;c++)
		{
			GrayValue[r][c]=255;//先把当前点置成白色
			if(convo[r][c-1]==0||convo[r][c]==0||convo[r][c+1]==0)
				GrayValue[r][c]=0;//模板下有一个点为黑色就把当前点置成黑色
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);	
}

void CImageCodesDoc::OnPengH1() //对当前图进行水平膨胀
{
	// TODO: Add your command handler code here
	label=TRUE;
	unsigned int r,c;
	xingflag=TRUE;
	if(erflag==false)
	  ProcessMaxl1();
	for(r=0;r<r0;r++)
		for(c=1;c<c0-1;c++)
		{
			GrayValue[r][c]=255;
			if(convo[r][c-1]==0||convo[r][c]==0||convo[r][c+1]==0)
				GrayValue[r][c]=0;
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);		
}

void CImageCodesDoc::OnPengFang()//对原始图进行方形膨胀 
{
	// TODO: Add your command handler code here
	label=false;
	unsigned int r,c,i,j;
	BOOL breakflag=false;
	ProcessMaxl();

	for(r=0;r<r0-2;r++)
		for(c=0;c<c0-2;c++)
		{
			GrayValue[r+1][c+1]=255;
			for(i=0;i<3;i++)
			{	for(j=0;j<3;j++)
				     if(convo[r+i][c+j]==0)
					 {GrayValue[r+1][c+1]=0;breakflag=TRUE;break;}
				if(breakflag==TRUE) break;
			}
			breakflag=false;
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);	
}
void CImageCodesDoc::OnPengFang1()//对当前图进行方形膨胀 
{
	// TODO: Add your command handler code here
	label=TRUE;
	BOOL breakflag=false;
	unsigned int r,c,i,j;
	xingflag=TRUE;
	if(erflag==false)
	  ProcessMaxl1();
 	for(r=0;r<r0-2;r++)
		for(c=0;c<c0-2;c++)
		{
			GrayValue[r+1][c+1]=255;
			for(i=0;i<3;i++)
			{	for(j=0;j<3;j++)
				     if(convo[r+i][c+j]==0)
					 {GrayValue[r+1][c+1]=0;breakflag=TRUE;break;}
				if(breakflag==TRUE) break;
			}
			breakflag=false;
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);		
}


void CImageCodesDoc::OnPengV() //对原始图进行垂直膨胀
{
	// TODO: Add your command handler code here
	label=false;
	unsigned int r,c;
	ProcessMaxl();

	for(r=1;r<r0-1;r++)
		for(c=0;c<c0;c++)
		{
			GrayValue[r][c]=255;
			if(convo[r-1][c]==0||convo[r][c]==0||convo[r+1][c]==0)
				GrayValue[r][c]=0;
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);	
}

void CImageCodesDoc::OnPengV1()//对当前图进行垂直膨胀 
{
	// TODO: Add your command handler code here
	label=TRUE;
	unsigned int r,c;
    xingflag=TRUE;
	if(erflag==false)
	  ProcessMaxl1();
     for(r=1;r<r0-1;r++)
		for(c=0;c<c0;c++)
		{
			GrayValue[r][c]=255;
			if(convo[r-1][c]==0||convo[r][c]==0||convo[r+1][c]==0)
				GrayValue[r][c]=0;
		}
  CopyGVToConvo();
  Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);		
}

void CImageCodesDoc::OnUpdatePengV1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);
}

void CImageCodesDoc::OnUpdatePengV(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);
}

void CImageCodesDoc::OnUpdatePengFang1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePengH(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePengFang(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePengH1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(trans!=NULL);

⌨️ 快捷键说明

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