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

📄 myinterfacedlg.cpp

📁 用数字图像处理主要是为了修改图形,改善图像质量,或是从图像中提起有效信息,还有利用数字图像处理可以对图像进行体积.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
void CMyInterfaceDlg::OnBnClickedSearchfromlib()//统计灰度直方图
{
	// TODO: 在此添加控件通知处理程序代码	
	HWND hWnd=m_hWnd;
	BOOL c=lplas.Get("c:\\gray.bmp");
	if(c==FALSE)
		return;		
	lplas.Histogram(hWnd,AfxGetApp()->m_hInstance);	
}



void CMyInterfaceDlg::OnBnClickedFind()//搜索相似的图片
{
	// TODO: 在此添加控件通知处理程序代码
	/*CAllFunction allFunc;
	allFunc.DoModal();*/
	intSD=0;
	if(picInput==TRUE)
	{
		UpdateData(TRUE);
		CDC *pDC=GetDlgItem(IDC_PIC_LIB)->GetDC();		
		//pDC->TextOut(10,168,"检索结果:");
		CBmpProc* pDestBmp;//目标图	
		CBmpProc bmp;
		int totalReNum;
		
		//double fsim[15];//与15张图相比较的相似度存放数组    
		//int psim[15];//与fsim向对应的图片编号数组,以便显示
		if(!m_pset->IsOpen())
			m_pset->Open();		
		if(m_pset->GetRecordCount()>0)
		{
			m_pset->MoveFirst();
			while(!m_pset->IsEOF())
			{
				m_pset->MoveNext();
			}
			totalReNum=(int)m_pset->GetRecordCount();
		}
		else
			totalReNum=0;
		CArray<double,double> fsim;
		fsim.SetSize(totalReNum,32);	
		CArray<long,long> psim;
		psim.SetSize(totalReNum,32);
		if(m_pset->GetRecordCount()>0)
		{
			m_pset->MoveFirst();
			int picnum=0;
			m_ColorGraphSubmit.EnableWindow(FALSE);
			while(!m_pset->IsEOF())
			{
				CLapls lplas;
				BOOL b=lplas.Get((char*)(LPCSTR)(CString)m_pset->m_picAddr);
				if(b==FALSE)
					return;
				HBITMAP hBitmap=lplas.ColortoGrayScale(NULL);	
				bmp.LoadFromHbmp(hBitmap);
				//bmp.LoadFromFile((CString)m_pset->m_picAddr);				
				pDestBmp=(CBmpProc*)new CBmpProc;
				pDestBmp->LoadFromObject(bmp);
				CSize objsize=pDestBmp->Size();
				int isize=(objsize.cx>objsize.cy)?objsize.cx:objsize.cy;
				pDestBmp->CalculateColor(pDC,isize);
				int x1,x2,y1,y2,x3,x4,y3,y4;
				x1=m_x1;x2=m_x2;x3=m_x3;x4=m_x4;
				y1=m_y1;y2=m_y2;y3=m_y3;y4=m_y4;
				double sim[4][4];//子块之间的相似度数组
				int ccount[4][4];//有过统计的颜色数目记录数组
				for(int i=0;i<4;i++)
					for(int j=0;j<4;j++)
					{
						sim[i][j]=0;
						ccount[i][j]=0;
					}
				for(int i=0;i<4;i++)
					for(int j=0;j<4;j++)
						for(int k=0;k<256;k++)
						{
							if((pDestBmp->Color[i][j][k]>=pBmp->Color[i][j][k])&&pDestBmp->Color[i][j][k]!=0)
							{
								sim[i][j]+=(1-((fabs((long double)(pDestBmp->Color[i][j][k]-pBmp->Color[i][j][k])))/(pDestBmp->Color[i][j][k])));
								ccount[i][j]++;
							}
							else if((pDestBmp->Color[i][j][k]<pBmp->Color[i][j][k])&&pDestBmp->Color[i][j][k]!=0)
							{
								sim[i][j]+=(1-((fabs((long double)(pDestBmp->Color[i][j][k]-pBmp->Color[i][j][k])))/(pBmp->Color[i][j][k])));
								ccount[i][j]++;
							}
						}
				for(int i=0;i<4;i++)
					for(int j=0;j<4;j++)
						sim[i][j]=sim[i][j]/ccount[i][j];

							//计算两图像最终的相似度结果
				double final_sim=0;
				for(int i=0;i<4;i++)
					for(int j=0;j<4;j++)
						if((i==x1&&j==y1)||(i==x2&&j==y2)||(i==x3&&j==y3)||(i==x4&&j==y4))
							final_sim+=sim[i][j];
						else
							final_sim+=sim[i][j]*0.7;	
				final_sim=final_sim/16;
				fsim.SetAt(picnum,final_sim);
				psim.SetAt(picnum,m_pset->m_id);
				delete pDestBmp;
				m_pset->MoveNext();
				picnum++;
			}
			m_ColorGraphSubmit.EnableWindow(TRUE);
			double tempf;
			long tempp;	
			for(int i=m_pset->GetRecordCount();i>0;i--)
				for(int j=0;j<i-1;j++)
				{
					if(fsim.GetAt(j)<fsim.GetAt(j+1))
					{
						tempp=psim[j];
						tempf=fsim[j];
						fsim[j]=fsim[j+1];
						psim[j]=psim[j+1];
						fsim[j+1]=tempf;
						psim[j+1]=tempp;										
					}
				}
				//搜索出最相似的一张图片
				if(totalReNum>0)
				{			
					if(fsim.GetAt(0)>=(m_valve-0.000000000000004))
					{
						long pp=psim.GetAt(0);
						/*CString strSql;
						strSql.Format("select * from pic where id=%f",pp);				
						m_pset->m_pDatabase->ExecuteSQL(strSql);			*/
						m_pset->MoveFirst();
						while(m_pset->m_id!=pp)
							m_pset->MoveNext();				
						bmp.LoadFromFile((CString)m_pset->m_picAddr);
						pDest=new CBmpProc;
						pDest->LoadFromObject(bmp,NULL);	
						CRect rect;					
						::GetClientRect(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC_LIB),&rect);
						pDest->Draw(*pDC,&rect);
						picShow=TRUE;
						m_valve=fsim.GetAt(0);
						UpdateData(FALSE);
					}
					else
					{
						/*if(pBmp!=NULL)
						{
						delete pBmp;
						pBmp=NULL;
						}*/
						m_pset->Close();
						AfxMessageBox("图片库没有与原图相似的图片!");
						return;
					}

				}
		}			
		else
		{
			/*if(pBmp!=NULL)
			{
				delete pBmp;
				pBmp=NULL;
			}*/
			m_pset->Close();
			AfxMessageBox("图片库为空!!");
			return;
		}
			
		m_pset->Close();
		//delete pBmp;
	}
	else
	{
		/*if(pBmp!=NULL)
		{
			delete pBmp;
            pBmp=NULL;
		}*/
		AfxMessageBox("请输入原图!!");
		return;
	}
	
}

void CMyInterfaceDlg::OnBnClickedButton7()
{
	// TODO: 在此添加控件通知处理程序代码
	m_ListPic.ResetContent();
	if(!m_pset->IsOpen())
		m_pset->Open();
	m_pset->AddNew();
	CString strSql;
	strSql.Format("insert into pic(picaddr) values('%s')",SourcePic);
	m_pset->m_pDatabase->ExecuteSQL(strSql);
	m_pset->Requery();
	m_pset->MoveLast();	
	//去掉路径只取文件名
	//CString strPic=(CString)(m_pset->m_picAddr);
	//int i=strPic.ReverseFind('\\');
	//strPic=strPic.Mid(i+1,strPic.GetLength()-i);
	m_ListPic.AddString(SourcePic);
	m_ListPic.SetCurSel(0);
	m_pset->Close();
}

void CMyInterfaceDlg::OnBnClickedButton8()//设置参数和阀值
{
	// TODO: 在此添加控件通知处理程序代码
	if(picInput==TRUE)
	{
		UpdateData(TRUE);
		if(m_x1==-1&&m_x2==-1&&m_x3==-1&&m_x4==-1&&m_y1==-1&&m_y2==-1&&m_y3==-1&&m_y4==-1)
		{
			AfxMessageBox("请输入一个适当的子块!");
			m_x1=1;m_y1=1;
			m_x2=1;m_y2=2;
			m_x3=2;m_y3=1;
			m_x4=2;m_y4=2;
			UpdateData(FALSE);
			return;
		}	
		CDC* pDC=CWnd::FromHandle(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC))->GetDC();
		CBmpProc bmp;
		CString string(SourcePic);
		CLapls lplas;
		BOOL b1=lplas.Get((char*)(LPCSTR)string);
		if(b1==FALSE)
			return;
		HBITMAP hBitmap=lplas.ColortoGrayScale(NULL);	
		bmp.LoadFromHbmp(hBitmap);
		//bmp.LoadFromFile(string);
		if(m_left==0&&m_right==0&&m_top==0&&m_bottom==0)
		{
			CSize objsize=bmp.Size();
			m_left=m_top=0;
			m_right=objsize.cx;
			m_bottom=objsize.cy;
			UpdateData(False);
		}
		if(pBmp!=NULL)
		{
			delete pBmp;
			pBmp=NULL;
			pBmp=new CBmpProc;
		}
		else
			pBmp=new CBmpProc;
		BOOL b=pBmp->LoadFromObject(bmp,&CRect(m_left,m_top,m_right,m_bottom));			
		if(b==FALSE)
		{
			AfxMessageBox("输入坐标不合法!");
			return;
		}			
		CDC* dcPic;
		CRect rect;
		dcPic=CWnd::FromHandle(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC))->GetDC();
		::GetClientRect(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC),&rect);		
		CSize objsize=pBmp->Size();
		int isize=(objsize.cx>objsize.cy)?objsize.cx:objsize.cy;	
		pBmp->CalculateColor(pDC,isize);	//计算原图的颜色直方图
		if(m_x1!=-1&&m_y1!=-1)
			pBmp->CalculateColorPair(m_x1,m_y1);
		if(m_x2!=-1&&m_y2!=-1)
			pBmp->CalculateColorPair(m_x2,m_y2);
		if(m_x3!=-1&&m_y3!=-1)
			pBmp->CalculateColorPair(m_x3,m_y3);
		if(m_x4!=-1&&m_y4!=-1)
			pBmp->CalculateColorPair(m_x4,m_y4);//其实在以上的4部计算中,已经形成了初步的颜色对表,在此只不过是将表中的数据从大到
		//小排列出来并且祛除差值小于某一域值的颜色对,形成颜色对表		
		pBmp->SortColorPair(); //颜色对表计算出来,表中的数据既是用户输入的该图像的代表特征
		CPicture picshow;
		picshow.ShowPic((char*)(LPCSTR)string,m_hWnd,IDC_PIC);
		//pBmp->Draw(*dcPic,&rect);
	}
	else
	{
		AfxMessageBox("请输入原图!");
		return;
	}
	
}

void CMyInterfaceDlg::OnBnClickedButtoncolorpair()//颜色对法搜索图片
{
	// TODO: 在此添加控件通知处理程序代码
	intSD=0;
	UpdateData(TRUE);
	if(pBmp==NULL)
	{
		AfxMessageBox("原图未被载入");
		return;
	}	
	if(picInput==TRUE)
	{
		CDC *pDC=GetDlgItem(IDC_PIC_LIB)->GetDC();		
		//UpdateData(TRUE);
		CBmpProc bmp;	
		CBmpProc* pDestBmp;
		int totalReNum;		
		if(!m_pset->IsOpen())
			m_pset->Open();
		if(m_pset->GetRecordCount()>0)
		{
			m_pset->MoveFirst();
			while(!m_pset->IsEOF())
			{
				m_pset->MoveNext();
			}
			totalReNum=(int)m_pset->GetRecordCount();
		}
		else
			totalReNum=0;
		CArray<int,int> fsim;
		fsim.SetSize(totalReNum,32);	
		CArray<long,long> psim;
		psim.SetSize(totalReNum,32);
		if(m_pset->GetRecordCount()>0)
		{
			m_ColorPairSubmit.EnableWindow(FALSE);
			double ave=0;//确定匹配时候不能使用精确匹配,所以需要一个差值小于某一域值时的域值
			for(int s=0;s<pBmp->pair_count;s++)
			{
				ave+=pBmp->pair[s].o_dis;
			}
			ave=ave/pBmp->pair_count;
			ave=ave*0.02;//确定误差小于2%的颜色对均属于这个域值
			m_pset->MoveFirst();
			int picnum=0;
			while(!m_pset->IsEOF())
			{
				CLapls lplas;
				BOOL b=lplas.Get((char*)(LPCSTR)(CString)m_pset->m_picAddr);
				if(b==FALSE)
					return;
				HBITMAP hBitmap=lplas.ColortoGrayScale(NULL);	
				bmp.LoadFromHbmp(hBitmap);
				//bmp.LoadFromFile((CString)m_pset->m_picAddr);				
				pDestBmp=(CBmpProc*)new CBmpProc;
				pDestBmp->LoadFromObject(bmp);
				CSize objsize=pDestBmp->Size();
				int isize=(objsize.cx>objsize.cy)?objsize.cx:objsize.cy;
				pDestBmp->CalculateColor(pDC,isize);				
				int match=0;
				int pairflag[128];//颜色对匹配标志数组,即某一颜色对如果在目标图像中找到,下一次就不能再匹配
				for(int t=0;t<128;t++)
					pairflag[t]=-1;
				for(int i=0;i<4;i++)//按顺序计算目标图像中一子块与其周围子块的颜色对,然后在用户输入的图像的颜色对表中查询计算出
				{
					for(int j=0;j<4;j++)//来的颜色对
					{
						pDestBmp->CalculateColorPair(i,j);						
						pDestBmp->SortColorPair();
						for(int comp=0;comp<pDestBmp->pair_count;comp++)//差值小于某域值,则匹配到
							for(int count=0;count<pBmp->pair_count;count++)
							{
								if((pairflag[count]!=0)&&(fabs(pBmp->pair[count].o_dis-pDestBmp->pair[comp].o_dis)<ave))
								{
									pairflag[count]=0;//标识了原图中被匹配到的欧氏值
									match++;
									break;
								}
							}
					}
					for(int re=0;re<pDestBmp->pair_count;re++)
						pDestBmp->pair[re].o_dis=-1;
				}
				fsim.SetAt(picnum,match);
				psim.SetAt(picnum,m_pset->m_id);
				delete pDestBmp;
				m_pset->MoveNext();
				picnum++;
			}
			m_ColorPairSubmit.EnableWindow(TRUE);
			int tempf;
			long tempp;	
			for(int i=m_pset->GetRecordCount();i>0;i--)
				for(int j=0;j<i-1;j++)
				{					
					if(fsim[j]<fsim[j+1])
					{
						tempp=psim[j];
						tempf=fsim[j];	
						fsim[j]=fsim[j+1];
						psim[j]=psim[j+1];
						fsim[j+1]=tempf;
						psim[j+1]=tempp;								
					}
				}
			int ff=fsim[0];
			if(fsim[0]>=(pBmp->pair_count)*m_valve)
			{
				long pp=psim[0];					
				m_pset->MoveFirst();
				while(m_pset->m_id!=pp)
					m_pset->MoveNext();				
				bmp.LoadFromFile((CString)m_pset->m_picAddr);
				pDest=new CBmpProc;
				pDest->LoadFromObject(bmp,NULL);	
				CRect rect;					
				::GetClientRect(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC_LIB),&rect);
				pDest->Draw(*pDC,&rect);
				picShow=TRUE;
				m_valve=((double)fsim.GetAt(0))/((double)pBmp->pair_count);
				UpdateData(FALSE);
			}
			else
			{
				m_pset->Close();
				AfxMessageBox("图片库没有与原图相似的图片!");				
				return;
			}
		}		
		else
		{
			m_pset->Close();
			AfxMessageBox("图片库为空!!");
			return;
		}
		m_pset->Close();
	}
	else
	{		
		AfxMessageBox("请输入原图!!");
		return;
	}	
}
void CAboutDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	OnOK();
}

LRESULT CMyInterfaceDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO: 在此添加专用代码和/或调用基类
	CRect windowRect;
	GetWindowRect(&windowRect);
	switch(message)
	{
	case WM_CREATE:
	case WM_SETFOCUS:
	case WM_SIZE:
    case WM_KILLFOCUS:
    case WM_LBUTTONDOWN:
	case WM_LBUTTONUP:
	case WM_MOVE:
	case WM_NCPAINT:
	case WM_NCACTIVATE:
	case WM_NOTIFY:		
		InvalidateRect(&windowRect,TRUE);
		break;
	case WM_PAINT:
		{
			CDC* dc = GetWindowDC();			
			if (dc)
				DrawTitleBar(dc);		
			if(picInput==TRUE&&pBmp!=NULL)//原图重画
			{				
				/*HWND hWnd = ::FindWindow(NULL,"MyInterface");
				CPicture pic;			
				pic.ShowPic(SourcePic,hWnd,IDC_PIC);*/
				/*CDC* dcPic;
				CRect rect;
				dcPic=CWnd::FromHandle(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC))->GetDC();
				::GetClientRect(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC),&rect);
				pBmp->Draw(*dcPic,&rect);*/
				CPicture pic;			
				pic.ShowPic(SourcePic,m_hWnd,IDC_PIC);
			}
			if(pDest!=NULL&&picShow==TRUE)
			{
				CDC* dcPic;
				CRect rect;
				dcPic=CWnd::FromHandle(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC_LIB))->GetDC();
				::GetClientRect(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC_LIB),&rect);
				pDest->Draw(*dcPic,&rect);
			}
			if(DestPic!=NULL&&intSD==2)//目的图重画
			{		
				HWND hWnd = m_hWnd;
				CPicture pic;			
				pic.ShowPic(DestPic,hWnd,IDC_PIC_LIB);			
			}
			if(charlap!=NULL&&intSD==1&&hBitmap!=NULL)//边缘检测重画
			{
				HWND hWnd = m_hWnd;
				CPicture pic;
				pic.ShowPic(hBitmap,hWnd,IDC_PIC_LIB);
			}
			if(charlap!=NULL&&intSD==3&&hBitmap!=NULL)//灰度图重画
			{
				HWND hWnd = m_hWnd;
				CPicture pic;
				pic.ShowPic(hBitmap,hWnd,IDC_PIC_LIB);
			}
			if(charlap!=NULL&&intSD==4&&hBitmap!=NULL)//去噪后重画
			{
				HWND hWnd = m_hWnd;
				CPicture pic;
				pic.ShowPic(hBitmap,hWnd,IDC_PIC_LIB);
			}
			ReleaseDC(dc);
		}
		break;
	default:break;
	}

	return CDialog::WindowProc(message, wParam, lParam);
}

⌨️ 快捷键说明

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