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

📄 watermarkxview.cpp

📁 一篇有关数字水印的程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	%**************************************************************
 */

	mwArray sim;
	mwArray temp1,temp2,temp3;
	temp1=times(Im_original,Im_modified);  // 相当于temp1=Im_original.*Im_modified
	temp2=power(Im_modified,2);
	temp3=power(Im_original,2);

	temp1=sum(sum(temp1));
	temp2=sum(sum(temp2));
	temp3=sum(sum(temp3));
	
	temp2=sqrt(temp2);
	temp3=sqrt(temp3);

	temp2=times(temp2,temp3);
	if(tobool(temp2==mwArray(0)))
			temp2=mwArray(0.0000000001); 
	
	sim=rdivide(double_func(temp1),temp2);
	return sim;	
}

mwArray CWaterMarkxView::CQ(mwArray Im_original, mwArray Im_modified)
{
/*	%**************************************************************
	% 计算两个图像相关质量子程序
	%     输入:  Im_original    原始图像
	%             Im_modified    修改过的图像
	%     输出:  Cq             相关质量值
	% 注:此程序用来计算两个图像的相关质量,根据图像的相关质量评价图像的失真程度
	%**************************************************************
  */
	mwArray Cq;

	if( tobool(size(Im_original)!=size(Im_modified)) )
	{
		MessageBox("错误:两个输入图像大小不一致!");
		return mwArray(-1);
	}



	//if( tobool(!isrgb(Im_original)&!isrgb(Im_modified)) )
	if(1)
	{
		mwArray A=Im_original;
		mwArray B=Im_modified;

		mwArray sumaProd=sum(sum(times(A,B)));
		mwArray sumaI=sum(sum(A));

		if(tobool(sumaI==mwArray(0)))
			sumaI=mwArray(0.0000000001); 		
		
		Cq=rdivide(sumaProd,sumaI);
		return Cq;
	}
	else
	{
		MessageBox("错误:输入图像为彩色图像");
		return mwArray(-1);
	}  	

}

void CWaterMarkxView::GetCoef(mwArray Im_original,int m,int n, mwArray Im_modified)
{		
	//得到相关系数cq、psnr、sim、 time;
	mwArray Cq,psnr,sim,nc;
	CString str,str1;
	Cq=CQ(Im_original,Im_modified);	     //	计算两个图像的相关质量
	psnr=PSNR(Im_original,m,n,Im_modified);  //计算两个灰度图像的失真程度
	nc=	NC(Im_original,Im_modified);	//计算两个图像的归一化互相关
	sim=Similar(Im_original,Im_modified);	 //计算两个图像的相似度

	str.Format("%0.6f",Cq.Double());
	m_cq.SetCaption(str);  

 //	str1.Format("cq=%f\tpsnr=%f\tsim=%f",Cq.Double(),psnr.Double(),sim.Double()	);
//	MessageBox(str1);
								   	
	str.Format("%0.6f",psnr.Double());	
	m_psnr.SetCaption(str);		 
	
	str.Format("%0.6f",nc.Double());
	m_nc.SetCaption(str);

	str.Format("%0.6f",sim.Double());	
	m_sim.SetCaption(str); 	 

	str.Format("%02d:%02d:%02d",costime.GetHours(),costime.GetMinutes(),costime.GetSeconds());
	m_time.SetCaption(str);
	str.Empty();

	UpdateData(FALSE);

}

int CWaterMarkxView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFormView::OnCreate(lpCreateStruct) == -1)
		return -1; 
	// TODO: Add your specialized creation code here 

	SetTimer(3,1000,NULL);
	return 0;
}

void CWaterMarkxView::OnUpdateFileOpen(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	//当检测图像时  嵌入水印不显示
	if(bcheck)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable();
	
}

void CWaterMarkxView::OnUpdateFileOpenWater(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	//打开原始图像文件或待检测图像文件后 
	//打开水印图像 才显示

	if(binsert||bcheck)
		pCmdUI->Enable(); 	
	else
		pCmdUI->Enable(FALSE); 
}

void CWaterMarkxView::OnUpdateWaterInsert(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	//当打开待检测图像文件后或水印图像文件为打开  则水印嵌入项不显示 

	if(!binsert||bshow==1)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable();
	
}

void CWaterMarkxView::OnUpdateWaterDistill(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	//嵌入水印时 等水印嵌入后才显示
	//检测图像时 打开水印图像后才显示
	if( (bshow==3&&binsert==1) || (bcheck==1 &&bdishow==-2) )
		pCmdUI->Enable();
	else
		pCmdUI->Enable(FALSE);

}

void CWaterMarkxView::OnUpdateDistillOpen(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	//当嵌入水印时  检测图像不显示
	if(binsert)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable();
	
}

/*void CWaterMarkxView::OnImageSave() 
{
	// TODO: Add your command handler code here	 
	try{	   
 		if(bsave_I)	
		{		   			
			OpenFileDlg(3);	   //保存嵌入水印后的图像 
		}
		if(bsave_C)
		{	   		
			 OpenFileDlg(4);	   //保存检测到的水印

		}  
		if(!Filename.IsEmpty())
		{	  
			Im_filename=mwArray(Filename);
			if(bsave_I)
			{
				subplot(mwArray(2),mwArray(2),mwArray(3)); 	
				C_imwrite(EI,mwArray(Filename),mwArray(Filetype));	 //保存嵌入水印后的图像
				title(mwArray("嵌入水印后的图像"));	

			}
			if(bsave_C)
			{
				subplot(mwArray(2),mwArray(2),mwArray(4)); 	
				C_imwrite(EWI2,mwArray(Filename),mwArray(Filetype));	 //保存检测到的水印
				title(mwArray("检测到的水印"));	
			
			}  
			// 设置窗口可见
 			//SetVisible(h_a,mwArray("On"));
 
 			// 进入窗口等待状态		 
			//mlfHGWaitForFiguresToDie(); 
		}
	}
	catch (mwException & ex){	 	
				mwDisplayException(ex);
	}  
	
}*/

/*void CWaterMarkxView::OnUpdateImageSave(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	//只有在水印嵌入和水印检测以后   保存项才可以显示
	if( bsave_I||bsave_C )
		pCmdUI->Enable();
	else
		pCmdUI->Enable(FALSE);

}*/

mwArray CWaterMarkxView::NC(mwArray Im_original, mwArray Im_modified)
{
/*	%**************************************************************
	%计算;两个矢量的相似度子程序
	%     输入:  Im_original    原始图像 
	%             Im_modified    修改过的图像
	%     输出:  nc             归一化互相关
	% 注:此程序用来计算两个矢量的相似度,通过相似度可以判定水印是否存在
	%**************************************************************
 */

	mwArray nc;
	mwArray temp1,temp2;
	temp1=times(Im_original,Im_modified);  // 相当于temp1=Im_original.*Im_modified
	temp2=power(Im_original,2); 
	temp1=sum(sum(temp1));
	temp2=sum(sum(temp2));
	if(tobool(temp2==mwArray(0)))
			temp2=mwArray(0.0000000001); 
	
	nc=rdivide(double_func(temp1),temp2);
	return nc;



}

CWaterMarkxView::CalImageLocation()
{
	int nImageWidth,nImageHeight;
	CWnd* pWnd=GetDlgItem(IDC_ORIGIN);
	WINDOWPLACEMENT *winPlacement;
	winPlacement=new WINDOWPLACEMENT;
	pWnd->GetWindowPlacement(winPlacement);
	
	if (m_OriginHDIB!=NULL)
	{
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_OriginHDIB);
		// 图象宽度
		nImageWidth=::DIBWidth(lpDIB);
		// 图象高度
		nImageHeight=::DIBHeight(lpDIB);
		::GlobalUnlock((HGLOBAL)  m_OriginHDIB);

	}




	
		// -----------------------------------------------------------------
		// 调整控件IDC_RECOG_INIIMAGE的大小位置,并同时设置显示基准图象的位置
	
	if(nImageHeight > (winPlacement->rcNormalPosition.bottom-winPlacement->rcNormalPosition.top)){
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + nImageHeight;	
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top +256;
		m_rectInitImage.bottom = winPlacement->rcNormalPosition.bottom;
		m_rectInitImage.top    = winPlacement->rcNormalPosition.top;		
	}
	else{
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
		m_rectInitImage.bottom = winPlacement->rcNormalPosition.top + 128 + nImageHeight/2;
		m_rectInitImage.top    = winPlacement->rcNormalPosition.top + 128 - nImageHeight/2;
	}
	if(nImageWidth > (winPlacement->rcNormalPosition.right-winPlacement->rcNormalPosition.left)){
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + nImageWidth;
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
		m_rectInitImage.right = winPlacement->rcNormalPosition.right;
		m_rectInitImage.left  = winPlacement->rcNormalPosition.left;			
	}
	else{
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
		m_rectInitImage.right = winPlacement->rcNormalPosition.left + 128 + nImageWidth/2;
		m_rectInitImage.left  = winPlacement->rcNormalPosition.left + 128 - nImageWidth/2;
	}
	/*
	winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
	m_rectInitImage.bottom = winPlacement->rcNormalPosition.bottom ;
	m_rectInitImage.top    = winPlacement->rcNormalPosition.top ;
	winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
	m_rectInitImage.right = winPlacement->rcNormalPosition.right ;
	m_rectInitImage.left  = winPlacement->rcNormalPosition.left ;*/
	
		// 设置IDC_RECOG_INIIMAGE控件的大小位置
	//pWnd->SetWindowPlacement(winPlacement);	
	

	// 获得显示模板图象控件的右边位置,以便确认显示模板图象控件的位置
	//int nIniImgRight;
	//nIniImgRight = winPlacement->rcNormalPosition.right;
	
	//int  nIniImgLeft;
	//nIniImgLeft   = winPlacement->rcNormalPosition.left;

	// 获得IDC_REG_INIT_IMAGE控件的下边位置,以便调整其他控件的位置
	//int nIniImgBottom;
	//nIniImgBottom = winPlacement->rcNormalPosition.bottom;

	// 获得IDC_REG_INIT_IMAGE控件的下边位置,以便调整其他控件的位置
	//int nIniImgtop = winPlacement->rcNormalPosition.top;

	// ------------------------------------------------------
	// 获得控件IDC_RECOG_MODIMAGE的句柄,并获得初始位置信息
	pWnd=GetDlgItem(IDC_QIANRUSUIYIN);
	pWnd->GetWindowPlacement(winPlacement);

	
	// 如果还未打开模板图象,则设置结果图象大小和初始图象大小相等
	/*if(m_FilterHDIB!=NULL)
	{
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_FilterHDIB);
		// 图象宽度
		nImageWidth=::DIBHeight(lpDIB);
		// 图象高度
		nImageHeight=::DIBHeight(lpDIB);
		::GlobalUnlock((HGLOBAL)  m_FilterHDIB);
	}*/
	
	//winPlacement->rcNormalPosition.left = nIniImgRight + 15;
	
	if(nImageHeight > (winPlacement->rcNormalPosition.bottom-winPlacement->rcNormalPosition.top)){		
		//winPlacement->rcNormalPosition.top = nIniImgtop;
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + nImageHeight;
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
		m_rectQianruSuiyin.bottom = winPlacement->rcNormalPosition.bottom;
		m_rectQianruSuiyin.top    = winPlacement->rcNormalPosition.top;		
	}
	else{
		//winPlacement->rcNormalPosition.top = nIniImgtop;
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
		m_rectQianruSuiyin.bottom = winPlacement->rcNormalPosition.top + 128 + nImageHeight/2;
		m_rectQianruSuiyin.top    = winPlacement->rcNormalPosition.top + 128 - nImageHeight/2;
	}
	if(nImageWidth > (winPlacement->rcNormalPosition.right-winPlacement->rcNormalPosition.left)){		
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + nImageWidth;
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
		m_rectQianruSuiyin.right = winPlacement->rcNormalPosition.right;
		m_rectQianruSuiyin.left  = winPlacement->rcNormalPosition.left;			
	}
	else{		
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
		m_rectQianruSuiyin.right = winPlacement->rcNormalPosition.left + 128 + nImageWidth/2;
		m_rectQianruSuiyin.left  = winPlacement->rcNormalPosition.left + 128 - nImageWidth/2;
	}
	/*
	winPlacement->rcNormalPosition.top = nIniImgtop;
	winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
	m_rectFilterImage.bottom = winPlacement->rcNormalPosition.bottom  ;
	m_rectFilterImage.top    = winPlacement->rcNormalPosition.top ;
	winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
	m_rectFilterImage.right = winPlacement->rcNormalPosition.right ;
	m_rectFilterImage.left  = winPlacement->rcNormalPosition.left ;*/
	// 设置IDC_RECOG_MODIMAGE控件的大小位置
	//pWnd->SetWindowPlacement(winPlacement);
		
	// 获得IDC_RECOG_MODIMAGE控件的右边位置,以便调整其他控件的位置
	//nIniImgRight  = winPlacement->rcNormalPosition.right;

	// ------------------------------------------------------
	// 获得控件IDC_RECOG_RESLTIMAGE的句柄,并获得初始位置信息
	pWnd=GetDlgItem(IDC_SUIYINIMAGE);
	pWnd->GetWindowPlacement(winPlacement);
	
	// 如果还未生成结果图象,则设置结果图象大小和初始图象大小相等
	if(m_SuiyinHDIB!=NULL)
	{
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_SuiyinHDIB);
		// 图象宽度
		nImageWidth=::DIBHeight(lpDIB);
		// 图象高度
		nImageHeight=::DIBHeight(lpDIB);
		::GlobalUnlock((HGLOBAL)  m_SuiyinHDIB);
	}
	// 调整控件IDC_RECOG_RESLTIMAGE的大小位置,并同时设置显示结果图象的位置

	// 先调整控件的左边位置,和IDC_RECOG_MODIMAGE控件相隔15个象素
	//winPlacement->rcNormalPosition.left = nIniImgRight + 15;
	
	if(nImageHeight > (winPlacement->rcNormalPosition.bottom-winPlacement->rcNormalPosition.top)){		
		//winPlacement->rcNormalPosition.top = nIniImgtop;
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + nImageHeight;	
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
		m_rectSuiyin.bottom = winPlacement->rcNormalPosition.bottom;
		m_rectSuiyin.top    = winPlacement->rcNormalPosition.top;		
	}
	else{
		//winPlacement->rcNormalPosition.top = nIniImgtop;
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
		m_rectSuiyin.bottom = winPlacement->rcNormalPosition.top + 128 + nImageHeight/2;
		m_rectSuiyin.top    = winPlacement->rcNormalPosition.top + 128 - nImageHeight/2;
	}
	if(nImageWidth > (winPlacement->rcNormalPosition.right-winPlacement->rcNormalPosition.left)){
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + nImageWidth;
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
		m_rectSuiyin.right = winPlacement->rcNormalPosition.right;
		m_rectSuiyin.left  = winPlacement->rcNormalPosition.left;			
	}
	else{
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
		m_rectSuiyin.right = winPlacement->rcNormalPosition.left + 128 + nImageWidth/2;
		m_rectSuiyin.left  = winPlacement->rcNormalPosition.left + 128 - nImageWidth/2;
	}
	/*
	winPlacement->rcNormalPosition.top = nIniImgtop;
	winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
	m_rectDetectImage.bottom = winPlacement->rcNormalPosition.bottom ;
	m_rectDetectImage.top    = winPlacement->rcNormalPosition.top ;
	winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
	m_rectDetectImage.right = winPlacement->rcNormalPosition.right;
	m_rectDetectImage.left  = winPlacement->rcNormalPosition.left;*/
	
	//pWnd->SetWindowPlacement(winPlacement);
	
	//nIniImgRight= winPlacement->rcNormalPosition.right;
	
	pWnd=GetDlgItem(IDC_TIQUSUIYIN);
	pWnd->GetWindowPlacement(winPlacement);
	
	if(nImageHeight > (winPlacement->rcNormalPosition.bottom-winPlacement->rcNormalPosition.top)){		
		//winPlacement->rcNormalPosition.top = nIniImgtop;
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + nImageHeight;	
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
		m_rectTiquSuiyin.bottom = winPlacement->rcNormalPosition.bottom;
		m_rectTiquSuiyin.top    = winPlacement->rcNormalPosition.top;		
	}
	else{
	//	winPlacement->rcNormalPosition.top = nIniImgtop;
		//winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
		m_rectTiquSuiyin.bottom = winPlacement->rcNormalPosition.top + 128 + nImageHeight/2;
		m_rectTiquSuiyin.top    = winPlacement->rcNormalPosition.top + 128 - nImageHeight/2;
	}
	if(nImageWidth > (winPlacement->rcNormalPosition.right-winPlacement->rcNormalPosition.left)){
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + nImageWidth;
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
		m_rectTiquSuiyin.right = winPlacement->rcNormalPosition.right;
		m_rectTiquSuiyin.left  = winPlacement->rcNormalPosition.left;			
	}
	else{
		//winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
		m_rectTiquSuiyin.right = winPlacement->rcNormalPosition.left + 128 + nImageWidth/2;

⌨️ 快捷键说明

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