📄 clusterkltransformationview.cpp
字号:
}
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 + -