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

📄 imagecodesdoc.cpp

📁 VC写的harris角点检测程序。又名plessey
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	{
		convo[r][0]=GrayValue[r][0];
		convo[r][c0-1]=GrayValue[r][c0-1];
	}

	for(r=0;r<r0-2;r++)
		for(c=0;c<c0-2;c++)
		{
			for(i=0;i<3;i++)
				for(j=0;j<3;j++)
					sort[i][j]=GrayValue[r+i][c+j];

				convo[r+1][c+1]=SortPinghuaK(sort);//取灰度值最相近6个像素的平均值赋给中心像素
		}

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

		::SetCursor(mHArrow);
}
unsigned int CImageCodesDoc::SortPinghuaK(unsigned int sort[3][3])
{
	unsigned int sort1[9],number[9],cha[9],count,i,j,t,sum;
	for(i=0,count=0;i<3;i++)
		for(j=0;j<3;j++)
			sort1[count++]=sort[i][j];//先把二维数组转化为一维数组
	for(i=0;i<9;i++)//cha中存放周围像素与中心像素的差值,number中存放9个像素中每个像素的标号
		cha[i]=abs(sort1[i]-sort1[4]),number[i]=i;

	for(count=1;count<4;count++)
		for(i=0;i<9-count;i++)
			if(cha[i]>cha[i+1])
			{//大数和对应的标号都要沉底
				t=cha[i],cha[i]=cha[i+1],cha[i+1]=t;
				t=number[i],number[i]=number[i+1],number[i+1]=t;
			}
	sort1[number[6]]=0;//把与中心像素最远的3个像素点的值置0。
	sort1[number[7]]=0;
	sort1[number[8]]=0;
	for(sum=0,i=0;i<9;i++) 
		sum+=sort1[i];//求最接近的6个像素的和
	sum=(unsigned int)(sum*0.167);//求6个像素的平均值
	if(sum>255)sum=255;//溢出检验
	return(sum);//返回平均值
}


void CImageCodesDoc::OnPinghuaK1() 
{
	// TODO: Add your command handler code here
	label=TRUE;//对当前图处理,原理同上

	if(convoflag==false) CopyGrayValueToConvo();

	::SetCursor(mHWait);

	unsigned int r,c,sort[3][3];
	unsigned int i,j;

	
	for(c=0;c<c0;c++)
	{
		GrayValue[0][c]=convo[0][c];
		GrayValue[r0-1][c]=convo[r0-1][c];
	}
	for(r=1;r<r0-1;r++)
	{
		GrayValue[r][0]=convo[r][0];
		GrayValue[r][c0-1]=convo[r][c0-1];
	}

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

		::SetCursor(mHArrow);
}

void CImageCodesDoc::OnPinghuaChao() //超限像素平滑
{
	// TODO: Add your command handler code here
	label=false;	
	unsigned int r,c,i,j,temp;
	double sum=0.0;
    ::SetCursor(mHWait);

 //  TemplateConvolution(T);
	if(Grayflag==false) Gray();

		for(c=0;c<c0;c++)
		{
		convo[0][c]=GrayValue[0][c];
		convo[r0-1][c]=GrayValue[r0-1][c];
		}
	    for(r=1;r<r0-1;r++)
		{
		convo[r][0]=GrayValue[r][0];
		convo[r][c0-1]=GrayValue[r][c0-1];
		}

	for(r=0;r<r0-2;r++)
		for(c=0;c<c0-2;c++)
		{
			for(i=0;i<3;i++)
				for(j=0;j<3;j++)
					sum+=GrayValue[r+i][c+j];
		   temp=abs((int)(sum*0.11));
		   if(temp>255) 
               convo[r+1][c+1]=255;
		   if(abs(GrayValue[r+1][c+1]-temp)>20)//是否与中心像素相差大于20
               convo[r+1][c+1]=temp;//若是,中心像素就改变
			else
			   convo[r+1][c+1]=GrayValue[r+1][c+1];//否则中心像素不变

			sum=0.0;
		}
	
   ConvertTo24Bits(convo);
   TransBack(convo);
   Display();
   ConvertTo8Bits(convo);
   convoflag=TRUE;

    ::SetCursor(mHArrow);
}

void CImageCodesDoc::OnPinghuaChao1() 
{
	// TODO: Add your command handler code here
	label=TRUE;	//对当前图进行处理
	unsigned int r,c,i,j,temp;
	double sum=0.0;
    ::SetCursor(mHWait);

 //  TemplateConvolution(T);
	if(convoflag==false) CopyGrayValueToConvo();

	for(c=0;c<c0;c++)
	{
		GrayValue[0][c]=convo[0][c];
		GrayValue[r0-1][c]=convo[r0-1][c];
	}
	for(r=1;r<r0-1;r++)
	{
		GrayValue[r][0]=convo[r][0];
		GrayValue[r][c0-1]=convo[r][c0-1];
	}


	for(r=0;r<r0-2;r++)
		for(c=0;c<c0-2;c++)
		{
			for(i=0;i<3;i++)
				for(j=0;j<3;j++)
					sum+=convo[r+i][c+j];
		   temp=abs((int)(sum*0.11));
		   if(temp>255) 
               GrayValue[r+1][c+1]=255;
		   if(abs(convo[r+1][c+1]-temp)>20)
               GrayValue[r+1][c+1]=temp;
			else
			   GrayValue[r+1][c+1]=convo[r+1][c+1];

			sum=0.0;
		}
	
    CopyGVToConvo();
	ConvertTo24Bits(convo);
	TransBack(convo);
	Display();
	ConvertTo8Bits(convo);
	Grayflag=false;

    ::SetCursor(mHArrow);
}

void CImageCodesDoc::OnPointStretch() //灰度拉伸
{
	// TODO: Add your command handler code here
    label=false;
	unsigned int r,c;
	double temp;
	if(Grayflag==false) Gray();
	::SetCursor(mHWait);
	for(r=0;r<r0;r++)
		for(c=0;c<c0;c++)
		{
			if(GrayValue[r][c]<150)//拉伸小于150的像素
				temp=GrayValue[r][c]*1.5;
			else
				temp=150+(GrayValue[r][c]-150)*0.286;//抑制大于150的像素

			if(temp>255)
				convo[r][c]=255;
			else 
				convo[r][c]=(int)(temp);
		}
    ConvertTo24Bits(convo);
	TransBack(convo);
	Display();
	ConvertTo8Bits(convo);
	convoflag=TRUE;

	::SetCursor(mHArrow);
}

void CImageCodesDoc::OnPointStretch1() 
{
	// TODO: Add your command handler code here
	label=TRUE;
	unsigned int r,c;
	double temp;
	if(convoflag==false) CopyGrayValueToConvo();
	::SetCursor(mHWait);
	for(r=0;r<r0;r++)
		for(c=0;c<c0;c++)
		{
			if(convo[r][c]<150)
				temp=convo[r][c]*1.5;
			else
				temp=150+(convo[r][c]-150)*0.286;

			if(temp>255)
				GrayValue[r][c]=255;
			else 
				GrayValue[r][c]=(int)(temp);
		}

    CopyGVToConvo();
	ConvertTo24Bits(convo);
	TransBack(convo);
	Display();
	ConvertTo8Bits(convo);
	Grayflag=false;

	::SetCursor(mHArrow);
}

void CImageCodesDoc::OnPointWindow() //窗口变换
{
	// TODO: Add your command handler code here
	label=false;
	unsigned int r,c;
	if(Grayflag==false) Gray();

	::SetCursor(mHWait);

	for(r=0;r<r0;r++)
		for(c=0;c<c0;c++)
		{
			if(GrayValue[r][c]>100)//大于100的像素统统赋成100,滤除亮的像素点
				convo[r][c]=100;
			else 
				convo[r][c]=GrayValue[r][c];
		}
    ConvertTo24Bits(convo);
	TransBack(convo);
	Display();
	ConvertTo8Bits(convo);
	convoflag=TRUE;

	::SetCursor(mHArrow);
}

void CImageCodesDoc::OnPointWindow1() 
{
	// TODO: Add your command handler code here
	label=TRUE;
	unsigned int r,c;
	if(convoflag==false) CopyGrayValueToConvo();

	::SetCursor(mHWait);

	for(r=0;r<r0;r++)
		for(c=0;c<c0;c++)
		{
			if(convo[r][c]>110)
				GrayValue[r][c]=110;
			else 
				GrayValue[r][c]=convo[r][c];
		}

	CopyGVToConvo();
    ConvertTo24Bits(convo);
	TransBack(convo);
	Display();
	ConvertTo8Bits(convo);
	Grayflag=false;

	::SetCursor(mHArrow);
}

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

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

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

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

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

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

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

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

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

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

void CImageCodesDoc::OnUpdateEdgePrewitt(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
		pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdateEdgePrewitt1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
		pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnEdgePrewitt() 
{
	// TODO: Add your command handler code here
 unsigned int i,j,GrayColor,Wx,Wy;

 label=false;
 if(Grayflag==false) Gray();
 ::SetCursor(mHWait);
 for(i=1;i<r0-1;i++)//prewitt算法
  for(j=1;j<c0-1;j++)
  {
	  Wx=(GrayValue[i-1][j+1]+GrayValue[i][j+1]+GrayValue[i+1][j+1])
         -(GrayValue[i-1][j-1]+GrayValue[i][j-1]+GrayValue[i+1][j-1]);
      Wy=(GrayValue[i+1][j-1]+GrayValue[i+1][j]+GrayValue[i+1][j+1])
         -(GrayValue[i-1][j-1]+GrayValue[i-1][j]+GrayValue[i-1][j+1]);
      GrayColor=abs(Wx)+abs(Wy);
      if(GrayColor>255) GrayColor=255;
      convo[i][j]=GrayColor;
   }

 ::SetCursor(mHArrow);
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);
 convoflag=TRUE;
}
void CImageCodesDoc::OnEdgePrewitt1() 
{
	// TODO: Add your command handler code here
label=true;

if(convoflag==false) CopyGrayValueToConvo();

unsigned int Wx,Wy,GrayColor;
unsigned int i,j,r,c;

	 ::SetCursor(mHWait);

	for(c=0;c<c0;c++)
	{
		GrayValue[0][c]=255;
		GrayValue[r0-1][c]=255;
	}
	for(r=1;r<r0-1;r++)
	{
		GrayValue[r][0]=255;
		GrayValue[r][c0-1]=255;
	}

 for(i=1;i<r0-1;i++)
  for(j=1;j<c0-1;j++)
  {
	  Wx=(convo[i-1][j+1]+convo[i][j+1]+convo[i+1][j+1])
        -(convo[i-1][j-1]+convo[i][j-1]+convo[i+1][j-1]);
      Wy=(convo[i+1][j-1]+convo[i+1][j]+convo[i+1][j+1])
        -(convo[i-1][j-1]+convo[i-1][j]+convo[i-1][j+1]);
      GrayColor=abs(Wx)+abs(Wy);
      if(GrayColor>255) GrayColor=255;
      GrayValue[i][j]=GrayColor;
   }
  
CopyGVToConvo();
Grayflag=false;
 ConvertTo24Bits(convo);
 TransBack(convo);
 Display();
 ConvertTo8Bits(convo);

	::SetCursor(mHArrow);
}
void CImageCodesDoc::ProcessMaxl()//对原始图用最大类间方差求取阈值
{
 erflag=TRUE;
 if(Grayflag==false) Gray();

 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=GrayValue[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
 for(i=1;i<r0-1;i++)
  for(j=1;j<c0-1;j++)
  {
	  if(GrayValue[i][j]<T) 
		  GrayColor=0;
      else 
		  GrayColor=255;

   convo[i][j]=GrayColor;
   }

⌨️ 快捷键说明

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