📄 watermarkxview.cpp
字号:
%**************************************************************
*/
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 + -