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

📄 linjunjuandoc.cpp

📁 图像处理软件,功能比较基础
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		dealpic.row=orgpic.row;
		dealpic.col=orgpic.col;
		if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
		{
			AfxMessageBox("分配空间错误!");
			return;
		}	
		IFFT(orgpic,cData);
		for (int i=0;i<orgpic.row;i++)
			for (int j=0;j<orgpic.col;j++)
			{
				dealpic.p[i][j]=(int)cData[i][j].real;			
			}
	for (i=0;i<orgpic.row;i++)
		delete [] cData[i];
	delete [] cData;
	cData=NULL;
	flagFourier=FALSE;	
	dspace_2d(orgpic.p,orgpic.row,orgpic.col);
	orgpic=dealpic;
	if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
	{
		AfxMessageBox("不能显示!");
		return ;
	}
	SaveHistory();
	InitDIBData();
	UpdateAllViews(NULL);
	}
	else 
		AfxMessageBox("没有经过付氏变换!");
	return;
}

void CLinjunjuanDoc::OnHistogram() 
{
	if (!flagpic)
	{
		AfxMessageBox("没有输入图象!");
		return;
	}

	Histogram dlg;
	dlg.gray=HistoGarm (orgpic);
	dlg.flagHis=TRUE;
	if (dlg.DoModal()==IDOK)
	{
	}
	return;	
}

void CLinjunjuanDoc::OnFliterPart() 
{
	if (!flagpic)
	{
		AfxMessageBox("没有输入图象!");
		return;
	}

	KERNEL ke;
	PartFliterDialog dlg;
	if (dlg.DoModal()==IDOK)
	{		
		ke=dlg.ker;
	}
	else return;
	dealpic.row=orgpic.row;
	dealpic.col=orgpic.col;
	if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
	{
		AfxMessageBox("分配空间错误!");
		return;
	}	
	::PartFliter(orgpic,ke,dlg.m_fenmu,dealpic);
	dspace_2d(orgpic.p,orgpic.row,orgpic.col);
	orgpic=dealpic;
	if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
	{
		AfxMessageBox("不能显示!");
		return ;
	}
	SaveHistory();
	InitDIBData();
	UpdateAllViews(NULL);
	return;	

	
}

void CLinjunjuanDoc::OnPrewitt() 
{
	if (!flagpic)
	{
		AfxMessageBox("没有输入图象!");
		return;
	}

	KERNEL kex,key;
	kex.kernel[0]=-1;
	kex.kernel[1]=0;
	kex.kernel[2]=1;
	kex.kernel[3]=-1;
	kex.kernel[4]=0;
	kex.kernel[5]=1;
	kex.kernel[6]=-1;
	kex.kernel[7]=0;
	kex.kernel[8]=1;
	key.kernel[0]=1;
	key.kernel[1]=1;
	key.kernel[2]=1;
	key.kernel[3]=0;
	key.kernel[4]=0;
	key.kernel[5]=0;
	key.kernel[6]=-1;
	key.kernel[7]=-1;
	key.kernel[8]=-1;
	
	
	dealpic.row=orgpic.row;
	dealpic.col=orgpic.col;
	if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
	{
		AfxMessageBox("分配空间错误!");
		return;
	}	
	::Sobel(orgpic,kex,key,dealpic);
	dspace_2d(orgpic.p,orgpic.row,orgpic.col);
	orgpic=dealpic;
	if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
	{
		AfxMessageBox("不能显示!");
		return ;
	}
	SaveHistory();
	InitDIBData();
	UpdateAllViews(NULL);
	return;	
	
	
}

void CLinjunjuanDoc::OnRoberts() 
{
	if (!flagpic)
	{
		AfxMessageBox("没有输入图象!");
		return;
	}
	dealpic.row=orgpic.row;
	dealpic.col=orgpic.col;
	if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
	{
		AfxMessageBox("分配空间错误!");
		return;
	}	
	::Robert(orgpic,dealpic);
	dspace_2d(orgpic.p,orgpic.row,orgpic.col);
	orgpic=dealpic;	
	if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
	{
		AfxMessageBox("不能显示!");
		return ;
	}
	SaveHistory();
	InitDIBData();
	UpdateAllViews(NULL);
	return;	

	
	
}

void CLinjunjuanDoc::OnRadon() 
{
	int i;
	if (!flagpic)
	{
		AfxMessageBox("没有输入图象!");
		return;
	}
		//AfxMessageBox("代码还未调试,暂时不能使用!");
		//return;
	/*
	for(i=0;i<orgpic.row;i++)
			for(int j=0;j<orgpic.col;j++)
			{
				orgpic.p[i][j]=orgpic.p[i][j]&193;//(31<<k);
				if(orgpic.p[i][j]!=0)
					orgpic.p[i][j]=255;				
			}	
	*/
	/*
	for (i=0;i<orgpic.row;i++)
		for (int j=0;j<orgpic.col;j++)
		{
			if (orgpic.p[i][j]!=0&&orgpic.p[i][j]!=255)
			{
				AfxMessageBox("不是二值图象!");
				return ;
			}
		}*/
		/*
	for (i=2;i<orgpic.row-2;i++)
		for (int j=2;j<orgpic.col-2;j++)
		{
			if (orgpic.p[i-2][j-2]==0&&orgpic.p[i-1][j-2]==0&&orgpic.p[i][j-2]==0&&orgpic.p[i+1][j-2]==0&&orgpic.p[i+2][j-2]
				&&orgpic.p[i-2][j-1]==0&&orgpic.p[i-1][j-1]==0&&orgpic.p[i][j-1]==0&&orgpic.p[i+1][j-1]==0&&orgpic.p[i+2][j-1]
				&&orgpic.p[i-2][j-0]==0&&orgpic.p[i-1][j]==0&&orgpic.p[i][j]==0&&orgpic.p[i+1][j]==0&&orgpic.p[i+2][j]
				&&orgpic.p[i-2][j+1]==0&&orgpic.p[i-1][j+1]==0&&orgpic.p[i][j+1]==0&&orgpic.p[i+1][j+1]==0&&orgpic.p[i+2][j+1]
				&&orgpic.p[i-2][j+2]==0&&orgpic.p[i-1][j+2]==0&&orgpic.p[i][j+2]==0&&orgpic.p[i+1][j+2]==0&&orgpic.p[i+2][j+2])
				orgpic.p[i][j]=255;

		}*/

 	RadonDialogBox dlg;
	if (dlg.DoModal()==IDOK)
	{	
		step=float(1.0/(float)(dlg.m_step));
		threshold=dlg.m_threshold;
		

		Radonpic=NewRadon(orgpic,&dlg.m_step,dealpic.row,dealpic.col);//RRadon(orgpic,&dlg.m_step,dealpic.row,dealpic.col);//Radon(orgpic,&dlg.m_step,dealpic.row,dealpic.col);
		cornernum=dealpic.row;
		rhoMax=dealpic.col;
		
		if (!(dealpic.p=::fspace_2d(dealpic.row,dealpic.col)))
		{
			AfxMessageBox("分配空间错误!");
			return;
		}
	//	flagRadon=TRUE;
	//	OnInvradon();
		
		::normalize(Radonpic,&dealpic.row,&dealpic.col,dealpic);
		dspace_2d(orgpic.p,orgpic.row,orgpic.col);
		orgpic.p=dealpic.p;
		orgpic.col=dealpic.col;
		orgpic.row=dealpic.row;
		flagRadon=TRUE;
		if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
		{
			AfxMessageBox("不能显示!");
			return ;
		}
		SaveHistory();
		InitDIBData();	
	//	OnSobel();//门限
		
 float u0=0,u1=0;                                //类内均值
 float w0=0,w1=0;                                //类概率
 float equ=0,max=0;                              //类间方差
 int sum=orgpic.col*orgpic.row;                         //总象素个数
 int gray[256];
 float percent[256];

 for(int i=0;i<256;i++)
 {
   gray[i]=0;percent[i]=0;
 }
 for(i=0;i<orgpic.row;i++)
	 for(int j=0;j<orgpic.col;j++)
		 gray[orgpic.p[i][j]]++;
	 for(i=0;i<256;i++)                       //计算各灰度级的比率
		 percent[i]=(float)gray[i]/(float)sum;
	 for(i=0;i<256;i++)
	 {
		 for(int j=0;j<i;j++)		   
		 {
		   u0+=percent[j]*j;w0+=percent[j];
		 }
		 for(j=i;j<256;j++)
		 {
			 u1+=percent[j]*j;w1+=percent[j];
		 }
		 if(w0!=0&&w1!=0)
			 equ=w0*w1*(u1/w1-u0/w0)*(u1/w1-u0/w0);
		 if(equ>max)
		 {
		//	threshold=i;
			 max=equ;
		 }
		 u0=u1=w0=w1=0;
	 }
	 
		
	 OnInvradon();
	 UpdateAllViews(NULL);	
		return;
	}
}
/*
void CLinjunjuanDoc::OnFileOpen() 
{
	CString ext = "Picture Types (*.bmp)|*.bmp|Picture Type(*.pic)|*.pic|All Files (*.*)|*.*||";
	CFileDialog dlg(TRUE, NULL , NULL,OFN_HIDEREADONLY ,ext, NULL);
	dlg.m_ofn.lpstrTitle = "请选择相关面数据文件";
	if(dlg.DoModal() == IDOK)
	{
		//CString FileName;
		//FileName=dlg.GetPathName;
		OnOpenDocument((LPCTSTR)dlg.GetPathName());		
	}
	else return ;
	
}
*/

void CLinjunjuanDoc::OnFileSaveAs() 
{		
	if (!orgpic.p)
		return;
	char ext[] = "picture types (*.bmp)|*.bmp|picture types (*.pic)|*.pic|picture types (*.tif)|*.tif|picture types (*.raw)|*.raw||";
	CFileDialog dlg(FALSE,"bmp" ,"*.bmp",OFN_OVERWRITEPROMPT|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY ,ext, NULL);
	if(dlg.DoModal() == IDOK)
	{		
		::writepic(dlg.GetPathName(),orgpic);		
	}
	else return ;
	
	
}

void CLinjunjuanDoc::OnNoise() 
{
	if (!flagpic)
	{
		AfxMessageBox("没有输入图象!");
		return;
	}

	NoiseDialogBox dlg;
	if (dlg.DoModal()==IDOK)
	{
		dealpic.row=orgpic.row;
		dealpic.col=orgpic.col;
		if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
		{
			AfxMessageBox("分配空间错误!");
			return;
		}
		Noise(orgpic,dealpic,dlg.m_num,dlg.m_gray);
		dspace_2d(orgpic.p,orgpic.row,orgpic.col);
		orgpic=dealpic;
		if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
		{
			AfxMessageBox("不能显示!");
			return ;
		}
		SaveHistory();
		InitDIBData();
		UpdateAllViews(NULL);
	}
	return;
}

void CLinjunjuanDoc::OnLowpass() 
{
if (!flagpic)
	{
		AfxMessageBox("没有输入图象!");
		return;
	}
	int rank0,rank1;
	rank0=(int)(log(orgpic.row)/log(2));
	rank1=(int)(log(orgpic.col)/log(2));
	if (pow(2,rank0)!=orgpic.row||pow(2,rank1)!=orgpic.col)
	{
		AfxMessageBox("图象大小不是2的倍数,不适合2FFT!");
		return; 
	}
	LowPass dlg;
	dlg.flagNo=0;
	int radius;
	if (dlg.DoModal()==IDOK)
	{
		radius=dlg.m_radius*orgpic.row/100;
		cData=new complex *[orgpic.row];
		for (int k=0;k<orgpic.row;k++)
			cData[k]=new complex [orgpic.col];
		if (!cData)
			return;
		for (int i=0;i<orgpic.row;i++)
			for (int j=0;j<orgpic.col;j++)
			{
				cData[i][j].real=orgpic.p[i][j];
				cData[i][j].imag=0;
			}
			dealpic.row=orgpic.row;
			dealpic.col=orgpic.col;
			if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
			{
				AfxMessageBox("分配空间错误!");
				return;
			}		
			Fourier(orgpic,cData);
			flagFourier=TRUE;
			int temprow,tempcol;
			temprow=orgpic.row/2;
			tempcol=orgpic.col/2;
			int threshold=(int)((radius*radius)/4);
			for(i=0;i<temprow;i++)
				for(int j=0;j<tempcol;j++)
					if((i*i+j*j)>threshold)
					{
						cData[i][j].real=cData[i][j].imag = 0;                        //半径以外的元素取0
						cData[i][orgpic.col-1-j].real=cData[i][orgpic.col-1-j].imag=0;
						cData[orgpic.row-1-i][j].real=cData[orgpic.row-1-i][j].imag=0;
						cData[orgpic.row-1-i][orgpic.col-1-j].real=cData[orgpic.row-1-i][orgpic.col-1-j].imag=0;			
					}
					OnIfft();	
	}
}

void CLinjunjuanDoc::OnHighpass() 
{
	
	if (!flagpic)
	{
		AfxMessageBox("没有输入图象!");
		return;
	}
	int rank0,rank1;
	rank0=(int)(log(orgpic.row)/log(2));
	rank1=(int)(log(orgpic.col)/log(2));
	if (pow(2,rank0)!=orgpic.row||pow(2,rank1)!=orgpic.col)
	{
		AfxMessageBox("图象大小不是2的倍数,不适合2FFT!");
		return; 
	}
    LowPass dlg;
	dlg.flagNo=1;
	int radius;
	if (dlg.DoModal()==IDOK)
	{
		radius=dlg.m_radius*orgpic.row/100;		
		cData=new complex *[orgpic.row];
		for (int k=0;k<orgpic.row;k++)
			cData[k]=new complex [orgpic.col];
		if (!cData)
			return;
		for (int i=0;i<orgpic.row;i++)
			for (int j=0;j<orgpic.col;j++)
			{
				cData[i][j].real=orgpic.p[i][j];
				cData[i][j].imag=0;
			}
			dealpic.row=orgpic.row;
			dealpic.col=orgpic.col;
			if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
			{
				AfxMessageBox("分配空间错误!");
				return;
			}			Fourier(orgpic,cData);
			flagFourier=TRUE;
			int temp=radius/2;//加速
			int threshold=radius*radius/4;
			for(i=0;i<temp;i++)
				for(int j=0;j<temp;j++)
					if((i*i+j*j)<threshold)
					{
						cData[i][j].real=cData[i][j].imag = 0;                        //半径以外的元素取0
						cData[i][orgpic.col-1-j].real=cData[i][orgpic.col-1-j].imag=0;
						cData[orgpic.row-1-i][j].real=cData[orgpic.row-1-i][j].imag=0;
						cData[orgpic.row-1-i][orgpic.col-1-j].real=cData[orgpic.row-1-i][orgpic.col-1-j].imag=0;
					}
					OnIfft();
	}
}


void CLinjunjuanDoc::OnInvradon() 
{
	if (!flagRadon)
	{
		AfxMessageBox("没有进行RADON变换!");
		return;
	}
	dealpic.row=oldpic.row;
	dealpic.col=oldpic.col;	
	if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
	{
		AfxMessageBox("分配空间错误!");
		return;
	}	
	reconstruct(Radonpic,&cornernum,&rhoMax,&step,&dealpic.row,&dealpic.col,dealpic.p,&threshold);
	for (int i=0;i<cornernum;i++)
	{
		delete [] Radonpic[i];
	}
	delete []Radonpic;
	Radonpic=NULL;
	flagRadon=FALSE;

	/*
	unsigned char  **temp;
	temp=fspace_2d(dealpic.row,dealpic.col);
	if (temp==NULL)
	return;
	for (int j=0;j<dealpic.col;j++)
		for (int i=0;i<dealpic.row;i++)
		{
			temp[i][j]=dealpic.p[i][j];
		}
	for (j=0;j<dealpic.col;j++)
		for (int i=0;i<dealpic.row;i++)
		{
			dealpic.p[i][dealpic.col-j-1]=temp[i][j];
		}
	dspace_2d(temp,dealpic.row,dealpic.col);
	*/
	dspace_2d(orgpic.p,orgpic.row,orgpic.col);
	orgpic.p=dealpic.p;
	orgpic.col=dealpic.col;
	orgpic.row=dealpic.row;
	if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
	{
		AfxMessageBox("不能显示!");
		return ;
	}
	SaveHistory();
	InitDIBData();
	UpdateAllViews(NULL);

}

void CLinjunjuanDoc::OnBigger() 
{
	rate=(float)(rate*1.1);
	flagsmall_big=TRUE;	
	UpdateAllViews(NULL);
}

void CLinjunjuanDoc::OnSmaller() 
{
	rate=(float)(rate*0.9);	
	flagsmall_big=TRUE;
	UpdateAllViews(NULL);
}

void CLinjunjuanDoc::OnViewReal() 
{
	rate=1.0;
	flagsmall_big=TRUE;
	UpdateAllViews(NULL);	
}

void CLinjunjuanDoc::OnThresholdTwo() 
{
	if (!flagpic)
	{
		AfxMessageBox("没有输入图象!");
		return;
	}
	dealpic.row=orgpic.row;
	dealpic.col=orgpic.col;
	if (!(dealpic.p=::fspace_2d(dealpic.row,dealpic.col)))
	{
		AfxMessageBox("分配空间错误!");
		return;
	}
	TwoThreshold dlg;
	dlg.gray=HistoGarm (orgpic);
	dlg.flagHis=TRUE;
	
	//显示要处理图形
	dlg.input=orgpic;
	dlg.output=dealpic;	
	dlg.flagpic=TRUE;
	if (dlg.DoModal()==IDOK)
	{
		dspace_2d(orgpic.p,orgpic.row,orgpic.col);
		orgpic=dlg.output;	
		if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
		{
			AfxMessageBox("不能显示!");
			return ;
		}
		SaveHistory();
		InitDIBData();
		UpdateAllViews(NULL);
		
	}
	return;	
}

⌨️ 快捷键说明

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