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

📄 bmptestview.cpp

📁 车牌识别及定位
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	   }
	   if (black>white)
			m_Gradmax=black;
	   else
		   m_Gradmax=white;
       m_Grade[0]=black;
	   m_Grade[255]=white;
	}
	pDoc->m_BM=false;
	Invalidate();
}

void CBmpTestView::OnZftBalance() 
{
	// TODO: Add your command handler code here

	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
    int i;
	double m_GradAdd[256];
	long j;
    m_GradAdd[0]=m_Grade[0];
// calculate integral
	for ( i=1;i<256;i++)
	{
	    m_GradAdd[i]=0;
	}
	for ( i=1;i<256;i++)
	{
	    m_GradAdd[i]=m_GradAdd[i-1]+m_Grade[i];
	}
	for ( i=1;i<256;i++)
	{
	    m_GradAdd[i]=m_GradAdd[i]*255/m_GradAdd[255];
	}
// 归一化阈值面积function
    for ( j=0;j<(long int) pDoc->m_Dib.BufferSize;j++)
	{
	   	*(pDoc->m_Dib.m_Buffer+j)=(int) (m_GradAdd[(*(pDoc->m_Dib.m_Buffer+j))]*255/m_GradAdd[255]);
	}
	for ( i=0;i<256;i++)
	{
	    m_Grade[i]=0;
	}
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
	}
	for ( i=0;i<256;i++)
	{
	    if (m_Grade[i]>m_Gradmax)
			m_Gradmax=m_Grade[i];
	}
	pDoc->m_BM=false;
	Invalidate();
}

void CBmpTestView::OnImageShow() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	pDoc->m_BM=true;
	Invalidate();	
}

void CBmpTestView::OnDtsmIn() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	if(pDoc->m_Dib.BPP!=8)
	{
       AfxMessageBox( "此图像为非256色图像,目前该算子还不支持这种图像格式");
	   return;
	}
	float T0,u1,u2,T1,w1,w2,u;
	int i,decimal, sign;
	long j;
	char string[80]="二值化最佳阈值为",*string1,*string2;
 	for ( i=0;i<256;i++)
	{
	    m_Grade[i]=0;
	}
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
	}
	u=0;
	for(i=0;i<256;i++)
		u=u+(float) i*m_Grade[i]/(int) pDoc->m_Dib.BufferSize;
	T0=u;T1=0;
    while (fabs(T0-T1)>0.01)
	{
		w1=0;w2=0;u1=0;u2=0;
		for(i=0;i<=int(T0);i++)
		{
			w1=w1+m_Grade[i];
			u1=u1+i*m_Grade[i];
		}
		for(i=int(T0)+1;i<256;i++)
		{
			w2=w2+m_Grade[i];
			u2=u2+i*m_Grade[i];
		}
		T1=T0;u1=u1/w1;u2=u2/w2;T0=0.5*(u1+u2);
	}
	string2=_fcvt(T0, 0, &decimal, &sign );
	string1=strcat(string,string2);
    AfxMessageBox(string1);
    for ( j=0;j<(long int) pDoc->m_Dib.BufferSize;j++)
	{
		*(pDoc->m_Dib.m_Buffer+j)=(*(pDoc->m_Dib.m_Buffer+j)>=T0)?255:0;
	}
}


void CBmpTestView::OnDtsmShow() 
{
	// TODO: Add your command handler code here
	CBmpTestView::OnImageShow();	
}

void CBmpTestView::OnDtsmOut() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	float u,uT[255],w[255],sigma[255],sigmamax;
	int i,T,Topt;
	long j;
	char string[80]="类间方差法二值化最佳阈值为",*string1,*string2,buffer[10];
 	for ( i=0;i<256;i++)
	{
	    m_Grade[i]=0;
	}
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
	}
	u=0;
	for(i=0;i<256;i++)
	{
		u=u+i*m_Grade[i];
	}
	u=u/pDoc->m_Dib.BufferSize;
	sigmamax=0;Topt=0;
	for(T=0;T<256;T++)
	{
		w[T]=0;uT[T]=0;
		for(i=0;i<=T;i++)
		{
			w[T]=w[T]+m_Grade[i];
			uT[T]=uT[T]+i*m_Grade[i];
		}
		uT[T]=uT[T]/pDoc->m_Dib.BufferSize;
		w[T]=w[T]/pDoc->m_Dib.BufferSize;
		sigma[T]=(u*w[T]-uT[T])*(u*w[T]-uT[T])/w[T]*(1-w[T]);
		if(sigma[T]>sigmamax)
		{
			sigmamax=sigma[T];Topt=T;
		}
	}
	string2=_itoa(Topt, buffer,10);
	string1=strcat(string,string2);
    AfxMessageBox(string1);	
}

void CBmpTestView::OnRecFilt() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	int i,j,image[4][4],Height,Width;
	//filtering
	Height=(int) pDoc->m_Dib.Height;
	Width=(int) pDoc->m_Dib.Bpl;
 	for (i=1;i<Height-1;i++)
	{
	    for (j=1;j<Width +1;j++)
		{
			image[2][2]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j);
			image[2][1]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j-1);
			image[2][3]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j+1);
			image[1][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j);
			image[1][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j-1);
			image[1][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j+1);
			image[3][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j);
			image[3][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j-1);
			image[3][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j+1);
			*(pDoc->m_Dib.m_Buffer+i*Width+j)=(image[1][1]+image[1][2]+image[1][3]+image[2][1]+image[2][2]+image[2][3]+image[3][1]+image[3][2]+image[3][3])/9;
		}
	}
	pDoc->m_BM=true;
	Invalidate();	
}

/*void queue(int *im,int n)
//int im[],n;
{
	int i,j,medium;
	for(i=1;i<n;i++)
	{
		for(j=i+1;j<n+1;j++)
		{
			if(im(j)>im(i))
			{
				medium=im(i);
				im(i)=im(j);
				im(j)=medium;
			}
		}
	}
}*/

void CBmpTestView::OnMidFilt() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	BYTE * m_Buffer1;
	int i,Height,Width,i1,j1,j;
	//filtering
	m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
	}
	if(pDoc->m_Dib.BPP==8)
	{
		int image[10],medium;
		Height=(int) pDoc->m_Dib.Height;
		Width=(int) pDoc->m_Dib.Bpl;
 		for (i=1;i<Height-1;i++)
		{
			for (j=1;j<Width +1;j++)
			{
				image[5]=(int) *(m_Buffer1+i*Width+j);
				image[4]=(int) *(m_Buffer1+i*Width+j-1);
				image[6]=(int) *(m_Buffer1+i*Width+j+1);
				image[2]=(int) *(m_Buffer1+(i-1)*Width+j);
				image[1]=(int) *(m_Buffer1+(i-1)*Width+j-1);
				image[3]=(int) *(m_Buffer1+(i-1)*Width+j+1);
				image[8]=(int) *(m_Buffer1+(i+1)*Width+j);
				image[7]=(int) *(m_Buffer1+(i+1)*Width+j-1);
				image[9]=(int) *(m_Buffer1+(i+1)*Width+j+1);
        		for(i1=1;i1<9;i1++)
				{
		        	for(j1=i1+1;j1<10;j1++)
					{
			    		if(image[j1]>image[i1])
						{
					    	medium=image[i1];
		        			image[i1]=image[j1];
			        		image[j1]=medium;
						}
					}
				}
				*(pDoc->m_Dib.m_Buffer+i*Width+j)=image[5];
			}
		}
	}
	else
	{
// 24位彩色中值滤波
		int image[10][4],medium[4],k;
		Height=(int) pDoc->m_Dib.Height;
		Width=(int) pDoc->m_Dib.Bpl;
 		for (i=1;i<Height-1;i++)
		{
			for (j=1;j<(int)Width/3 ;j++)
			{
				for(k=0;k<3;k++)
				{
					image[5][k+1]=(int) *(m_Buffer1+i*Width+j*3+k);
					image[4][k+1]=(int) *(m_Buffer1+i*Width+(j-1)*3+k);
					image[6][k+1]=(int) *(m_Buffer1+i*Width+(j+1)*3+k);
					image[2][k+1]=(int) *(m_Buffer1+(i-1)*Width+j*3+k);
					image[1][k+1]=(int) *(m_Buffer1+(i-1)*Width+(j-1)*3+k);
					image[3][k+1]=(int) *(m_Buffer1+(i-1)*Width+(j+1)*3+k);
					image[8][k+1]=(int) *(m_Buffer1+(i+1)*Width+j*3+k);
					image[7][k+1]=(int) *(m_Buffer1+(i+1)*Width+(j-1)*3+k);
					image[9][k+1]=(int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
				}
//冒泡排序
				for(i1=1;i1<9;i1++)
				{
		        	for(j1=i1+1;j1<10;j1++)
					{
			    		if((image[j1][1]+image[j1][2]+image[j1][3])/3>(image[i1][1]+image[i1][2]+image[i1][3])/3)
						{
							for(k=1;k<4;k++)
							{
					    		medium[k]=image[i1][k];
								image[i1][k]=image[j1][k];
								image[j1][k]=medium[k];
							}
						}
					}
					*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=image[5][1];
					*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=image[5][2];
					*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=image[5][3];
				}
			}
		}
	}
	if(m_Buffer1)
	{
		delete [] m_Buffer1;
		m_Buffer1=0;
	}
	pDoc->m_BM=true;
	Invalidate();	
	
}

void CBmpTestView::OnEdgeRobert() 
{
	// TODO: Add your command handler code here
	#include  <math.h>
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_Dib.BPP>8)
	{
		AfxMessageBox("该算子不能处理8位图像");
		return;
	}
	BYTE * m_Buffer1;
	int i,j,image[10],Height,Width,a,b;
	//filtering
	m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
	}
	Height=(int) pDoc->m_Dib.Height;
	Width=(int) pDoc->m_Dib.Bpl;
 	for (i=1;i<Height-1;i++)
	{
	    for (j=1;j<Width -1;j++)
		{
			image[1]=(unsigned int) *(m_Buffer1+(i-1)*Width+j-1);
			image[3]=(unsigned int) *(m_Buffer1+(i-1)*Width+j+1);
			image[7]=(unsigned int) *(m_Buffer1+(i+1)*Width+j-1);
			image[9]=(unsigned int) *(m_Buffer1+(i+1)*Width+j+1);
            a=abs(image[1]-image[9]);
			b=abs(image[3]-image[7]);
			*(pDoc->m_Dib.m_Buffer+i*Width+j)=((a>b)?a:b);
		}
	}
	if(m_Buffer1)
	{
		delete [] m_Buffer1;
		m_Buffer1=0;
	}
	pDoc->m_BM=true;
	Invalidate();	
}

void CBmpTestView::OnEdgeLaplace() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	if(pDoc->m_Dib.BPP>8)
	{
		AfxMessageBox("该算子只能处理8位图像");
		return;
	}
	int i,j,image[10],Height,Width,a;
	//filtering
	Height=(int) pDoc->m_Dib.Height;
	Width=(int) pDoc->m_Dib.Bpl;
//	Total=(int) pDoc->m_Dib.BufferSize;
 	for (i=1;i<Height-1;i++)
	{
	    for (j=1;j<Width +1;j++)
		{
			image[5]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+i*Width+j);
			image[4]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+i*Width+j-1);
			image[6]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+i*Width+j+1);
			image[2]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j);
			image[1]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j-1);
			image[3]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j+1);
			image[8]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j);
			image[7]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j-1);
			image[9]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j+1);
			a=image[2]+image[4]+image[6]+image[8]-4*image[5];
			*(pDoc->m_Dib.m_Buffer+i*Width+j)=((a>0)?a:0);
		}
	}
	pDoc->m_BM=true;
	Invalidate();	
}

void CBmpTestView::OnGauseFilt() 
{
	// TODO: Add your command handler code here

	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	if(pDoc->m_Dib.BPP>8)
	{
		AfxMessageBox("该算子只能处理8位图像");
		return;
	}
	int i,j,image[4][4],Height,Width;
	double a0,a1,a2;
	a0=1/sqrt(2*3.14);
	a1=0.6065/sqrt(2*3.14);
	a2=exp(-1)/sqrt(2*3.14);
	//filtering
	Height=(int) pDoc->m_Dib.Height;
	Width=(int) pDoc->m_Dib.Bpl;
 	for (i=1;i<Height-1;i++)
	{
	    for (j=1;j<Width +1;j++)
		{
			image[2][2]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j);
			image[2][1]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j-1);
			image[2][3]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j+1);
			image[1][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j);
			image[1][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j-1);
			image[1][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j+1);
			image[3][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j);
			image[3][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j-1);
			image[3][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j+1);
			*(pDoc->m_Dib.m_Buffer+i*Width+j)=(int)(image[1][1]*a2+image[1][2]*a1+image[1][3]*a2+image[2][1]*a1+image[2][2]*a0+image[2][3]*a1+image[3][1]*a2+image[3][2]*a1+image[3][3]*a2);
		}
	}
	pDoc->m_BM=true;
	Invalidate();	
	
}
void CBmpTestView::OnEdgeMarr() 
{
	// TODO: Add your command handler code here
	OnGauseFilt();
	OnEdgeLaplace();
}


void CBmpTestView::OnStruAdd() 
{
	// 二值形态学:膨胀,结构和
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	int i,j,image[4][4],Height,Width,a,k;
	//filtering
	Height=(int) pDoc->m_Dib.Height;
	Width=(int) pDoc->m_Dib.Bpl;
	BYTE * m_Buffer1;
	m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
	}
	m_Gradmax=0;
    for ( i=0;i<256;i++)
	{
	    m_Grade[i]=0;
	}
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	    m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
	}
	m_Gradmax=0;
    for ( i=1;i<256;i++)
	{
	   if (m_Grade[i]>m_Gradmax)
	   {
		  m_Gradmax=m_Grade[i];
		  k=i;
	   }
	}
 	for (i=1;i<Height-1;i++)
	{
	    for (j=1;j<Width +1;j++)
		{
			image[2][2]=(unsigned int) *(m_Buffer1+i*Width+j);
			image[2][1]=(unsigned int) *(m_Buffer1+i*Width+j-1);
			image[2][3]=(unsigned int) *(m_Buffer1+i*Width+j+1);
			image[1][2]=(unsigned int) *(m_Buffer1+(i-1)*Width+j);
			image[1][1]=(unsigned int) *(m_Buffer1+(i-1)*Width+j-1);
			image[1][3]=(unsigned int) *(m_Buffer1+(i-1)*Width+j+1);
			image[3][2]=(unsigned int) *(m_Buffer1+(i+1)*Width+j);
			image[3][1]=(unsigned int) *(m_Buffer1+(i+1)*Width+j-1);
			image[3][3]=(unsigned int) *(m_Buffer1+(i+1)*Width+j+1);
			a=image[1][1]||image[1][2]||image[1][3]||image[2][1]||image[2][2]||image[2][3]||image[3][1]||image[3][2]||image[3][3];
			*(pDoc->m_Dib.m_Buffer+i*Width+j)=(a?k:0);
		}
	}
	if(m_Buffer1)
	{
		delete [] m_Buffer1;
		m_Buffer1=0;
	}
	pDoc->m_BM=true;
	Invalidate();	
}

void CBmpTestView::OnStruSub() 
{
	// TODO: Add your command handler code here

⌨️ 快捷键说明

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