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

📄 clusterkltransformationview.cpp

📁 KL变换的实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

void CClusterKLTransformationView::OnThird() 
{
	 //第三主分量

	if(NewFileName=="") {AfxMessageBox("请先读入图象数据!");return;}
	if(fea.m_pData[0]==0) OnKl();
    result.Init(1,a);
	for(int i=0;i<a;i++)
	{
		for(int j=0;j<6;j++)
        result.m_pData[i]+=fea.m_pData[index[3]+j*6]*tm.m_pData[j*a+i];
	}
    Draw();

	CClusterKLTransformationDoc * pDoc = GetDocument();
	CDib *m_pDib;
	m_pDib = pDoc->pDib ;
	int m_bcount[256];
	int m_gcount[256];
	int m_rcount[256];
	int l,j;
	unsigned char * lpSrc;
	CSize sizeImage;
	sizeImage = m_pDib->GetDimensions();


	// 获得图象数据存储的高度和宽度
	CSize sizeSaveImage;
	sizeSaveImage = m_pDib->GetDibSaveDim();

	// 重置计数为0
	for (l = 0; l < 256; l ++)
	{
		// 清零
		m_bcount[l] = 0;
		m_gcount[l] = 0;
		m_rcount[l] = 0;
	}
	
	// 计算各个灰度值的计数,即得到直方图
	for (l = 0; l < sizeImage.cy; l ++)
	{
		for (j = 0; j < sizeImage.cx; j ++)
		{
			if(m_pDib->NumberColors()==8)
			{
			lpSrc = (unsigned char *)m_pDib->m_lpImage + sizeSaveImage.cx * l + j;
			
			// 计数加1
			m_bcount[*(lpSrc)]++;
			}
			else if(m_pDib->NumberColors()==24)
			{
			lpSrc = (unsigned char *)m_pDib->m_lpImage + sizeSaveImage.cx * l + j*3;
			
			// 计数加1
			m_bcount[*(lpSrc)]++;
			m_gcount[*(lpSrc+1)]++;
            m_rcount[*(lpSrc+2)]++;
			}
			
		}
	}


	double bcount=0;
	double gcount=0;
	double rcount=0;

	for(l=0;l<256;l++)
	{

		bcount+=m_bcount[l];
		gcount+=m_gcount[l];
		rcount+=m_rcount[l];
		
	}

	double x=bcount+gcount+rcount;
	AllPixel=&x;
}

void CClusterKLTransformationView::OnKl() //KL变换计算
{
	int i,j;
	xfea.Init(6,1);
	xfeat.Init(1,6);
	temp=CMatrix(6,6);
	feature=new double[6];
	fea.Init(6,6);
	double tmave[6];
	//求每幅图象的灰度均值
	for (i=0;i<6;i++)
	{
		tmave[i]=0;
		for(j=0;j<a;j++)
		{
			tmave[i]+=tm.m_pData[i*a+j];
		}
		tmave[i]/=(double)a;
	}
	//求方差矩阵R
	for(j=0;j<36;j++)
	{
	    temp.m_pData[j]=0.0;
		for(i=0;i<a;i++)
		{
		    temp.m_pData[j]+=(tm.m_pData[(j/6)*a+i%6]-tmave[j/6])*(tm.m_pData[(j%6)*a+i%6]-tmave[j%6]);
		}
		temp.m_pData[j]/=(double)a;
	}
   
    temp.JacobiEigenv2(feature, fea, 0.000001);//求特征值和特征向量

    double t=0.0;
	double featuretemp[6];//临时变量

    for(i=0;i<6;i++)
		featuretemp[i]=feature[i];//给临时数组赋值

    for(i=0;i<6;i++)//"冒泡法"将特征值排序
	   for(j=0;j<5;j++)
	  	 if(feature[j]>feature[j+1])
		 {
	  	   t=feature[j];
	  	   feature[j]=feature[j+1];
	  	   feature[j+1]=t;
		 }

    for(i=0;i<6;i++)//求出特征值排序后对应在特征值数组中的位置
	   for(j=0;j<6;j++) 
		   if(feature[i]==featuretemp[j]) 
		   {
			   index[i]=j;
		   }
}

void CClusterKLTransformationView::OnListshow() 
{
	
	// TODO: Add your command handler code here
	if(NewFileName=="") {AfxMessageBox("请先读入图象数据!");return;}
	CClusterKLTransformationDoc * pDoc = GetDocument();
	CDib *m_pDib;
	m_pDib = pDoc->pDib ;
	int m_bcount[256];
	int m_gcount[256];
	int m_rcount[256];
	int i,j;
	unsigned char * lpSrc;
	CSize sizeImage;
	sizeImage = m_pDib->GetDimensions();


	// 获得图象数据存储的高度和宽度
	CSize sizeSaveImage;
	sizeSaveImage = m_pDib->GetDibSaveDim();

	// 重置计数为0
	for (i = 0; i < 256; i ++)
	{
		// 清零
		m_bcount[i] = 0;
		m_gcount[i] = 0;
		m_rcount[i] = 0;
	}
	
	// 计算各个灰度值的计数,即得到直方图
	for (i = 0; i < sizeImage.cy; i ++)
	{
		for (j = 0; j < sizeImage.cx; j ++)
		{
			if(m_pDib->NumberColors()==8)
			{
			lpSrc = (unsigned char *)m_pDib->m_lpImage + sizeSaveImage.cx * i + j;
			
			// 计数加1
			m_bcount[*(lpSrc)]++;
			}
			else if(m_pDib->NumberColors()==24)
			{
			lpSrc = (unsigned char *)m_pDib->m_lpImage + sizeSaveImage.cx * i + j*3;
			
			// 计数加1
			m_bcount[*(lpSrc)]++;
			m_gcount[*(lpSrc+1)]++;
            m_rcount[*(lpSrc+2)]++;
			}
			
		}
	}


	double bcount=0;
	double gcount=0;
	double rcount=0;

	for(i=0;i<256;i++)
	{

		bcount+=m_bcount[i];
		gcount+=m_gcount[i];
		rcount+=m_rcount[i];
		
	}

	double x=bcount+gcount+rcount;
	AllPixel=&x;

	CString str="结果.txt";
	FILE *fpt;
	fpt=fopen(str,"w+");
	if(m_pDib->NumberColors()==24)
	{
	fprintf(fpt,"%s       %s          %s             %s\n","灰度值","B","G","R");
	for(i=0;i<256;i++)
	{
		fprintf(fpt,"%3d       %5d       %5d       %5d\n",i,m_bcount[i],m_gcount[i],m_rcount[i]);
	}
	}
	if(m_pDib->NumberColors()==8)
	{
    fprintf(fpt,"%s       %s\n","灰度值","数量");
	for(i=0;i<256;i++)
	{
		fprintf(fpt,"%3d       %5d\n",i,m_bcount[i]);
	}
	}
	fclose(fpt);
	ShellExecute(hwnd,NULL,str,NULL,NULL,SW_SHOWNORMAL);


}




void CClusterKLTransformationView::OnHistogram() 
{
	// TODO: Add your command handler code here
	if(NewFileName=="") {AfxMessageBox("请先读入图象数据!");return;}
	
	CHisto dlgHistShow;
	dlgHistShow.GetpDoc(GetDocument());
	// 初始化变量值
    dlgHistShow.DoModal();
}

void CClusterKLTransformationView::OnMouseMove(UINT nFlags, CPoint point) 
{

//	CString str;
//	str.Format("当前x坐标:%d \t当前y坐标:%d",point.x,point.y);
//	((CStatusBar*)AfxGetMainWnd()->GetDlgItem(AFX_IDW_STATUS_BAR))->SetPaneText(0,str,true);
//
//	CScrollView::OnMouseMove(nFlags, point);
	CDC* pDC = GetDC(); 
	if(!m_bStart) 
	m_bStart = true; 
		else 
	DoRubberCoord(pDC,m_OldPt);//当不是第一次移动鼠标时才需要先擦除上次的坐标 
	CString str; 
	str.Format("[%d,%d]",point.x,point.y); 
	CString Ctr;
	Ctr.Format("当前x坐标:%d \t当前y坐标:%d",point.x,point.y);
	((CStatusBar*)AfxGetMainWnd()->GetDlgItem(AFX_IDW_STATUS_BAR))->SetPaneText(0,Ctr,true);

	m_nCoordStrLen=str.GetLength()*WORD_WIDTH; 
	m_OldPt = point; 
	CopyBitmap(pDC,point); 
	DrawCoord(pDC,str,point); 
	ReleaseDC(pDC); 

}

//拷贝重画位图,将视图中坐标字符串所要占的矩形位置的图像复制备份 





//copyPt--鼠标当前的位置 





void CClusterKLTransformationView::CopyBitmap(CDC* pDC,CPoint copyPt) 


{ 


if(m_StoreBmp.GetSafeHandle()){//如果已有位图,则先清空 


m_StoreDC.DeleteDC(); 


m_StoreBmp.DeleteObject(); 


m_StoreBmp.m_hObject=0; 


} 





if(m_StoreDC.CreateCompatibleDC(pDC)) 


{ 


if(m_StoreBmp.CreateCompatibleBitmap(pDC,m_nCoordStrLen,WORD_HEIGHT)) 


{ 


m_StoreDC.SelectObject(&m_StoreBmp); 


m_StoreDC.BitBlt(0,0,m_nCoordStrLen,WORD_HEIGHT,pDC,copyPt.x+OFF_X,copyPt.y+OFF_Y,SRCCOPY); 


} 


else 


{ 


if(m_StoreBmp.GetSafeHandle()) 


m_StoreBmp.DeleteObject(); 


m_StoreDC.DeleteDC(); 


} 


} 


} 





//画坐标 





//coordString---坐标字符串 





//drawPt--绘制起点坐标 


void CClusterKLTransformationView::DrawCoord(CDC* pDC,CString& coordString,CPoint drawPt) 


{ 


if(m_StoreBmp.GetSafeHandle())//有位图才画 


{ 


drawPt.Offset(OFF_X,OFF_Y); 


CRect rect(drawPt,CSize(m_nCoordStrLen,WORD_HEIGHT)); 


pDC->SetBkMode(TRANSPARENT);//设置透明背景 


COLORREF crf = pDC->SetTextColor(TEXT_COLOR); 


pDC->DrawText(coordString,rect,DT_CENTER); 


pDC->SetTextColor(crf); 


} 


} 





//擦除上次的坐标 


void CClusterKLTransformationView::DoRubberCoord(CDC* pDC,CPoint showPt) 


{ 


if(m_StoreBmp.GetSafeHandle()) 


{ 


m_StoreDC.SelectObject(&m_StoreBmp); 


pDC->BitBlt(showPt.x+OFF_X,showPt.y+OFF_Y,m_nCoordStrLen,WORD_HEIGHT,&m_StoreDC,0,0,SRCCOPY); 


m_StoreDC.DeleteDC(); 


m_StoreBmp.DeleteObject(); 


} 


} 

⌨️ 快捷键说明

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