📄 linjunjuandoc.cpp
字号:
// linjunjuanDoc.cpp : implementation of the CLinjunjuanDoc class
//
#include "stdafx.h"
#include "linjunjuan.h"
#include "linjunjuanDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanDoc
IMPLEMENT_DYNCREATE(CLinjunjuanDoc, CDocument)
BEGIN_MESSAGE_MAP(CLinjunjuanDoc, CDocument)
//{{AFX_MSG_MAP(CLinjunjuanDoc)
ON_COMMAND(ID_SOBEL, OnSobel)
ON_COMMAND(ID_LAP, OnLap)
ON_COMMAND(ID_FIT_ITSELF, OnFitItself)
ON_COMMAND(IDC_NOCLEAR, OnNoclear)
ON_COMMAND(ID_FILTER_MED, OnFilterMed)
ON_COMMAND(ID_HistogramEqualization, OnHistogramEqualization)
ON_COMMAND(ID_OSTU, OnOstu)
ON_COMMAND(ID_FOURIER, OnFourier)
ON_COMMAND(ID_IFFT, OnIfft)
ON_COMMAND(ID_Histogram, OnHistogram)
ON_COMMAND(ID_FLITER_PART, OnFliterPart)
ON_COMMAND(ID_PREWITT, OnPrewitt)
ON_COMMAND(ID_ROBERTS, OnRoberts)
ON_COMMAND(ID_RADON, OnRadon)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_COMMAND(ID_NOISE, OnNoise)
ON_COMMAND(ID_LOWPASS, OnLowpass)
ON_COMMAND(ID_HIGHPASS, OnHighpass)
ON_COMMAND(ID_INVRADON, OnInvradon)
ON_COMMAND(ID_BIGGER, OnBigger)
ON_COMMAND(ID_SMALLER, OnSmaller)
ON_COMMAND(ID_VIEW_REAL, OnViewReal)
ON_COMMAND(ID_THRESHOLD_TWO, OnThresholdTwo)
ON_UPDATE_COMMAND_UI(ID_BACK, OnUpdateBack)
ON_UPDATE_COMMAND_UI(ID_FOWARD, OnUpdateFoward)
ON_COMMAND(ID_BACK, OnBack)
ON_COMMAND(ID_FOWARD, OnFoward)
ON_COMMAND(ID_NOISE_GASS, OnNoiseGass)
ON_COMMAND(ID_ROTATE_90_CLOSEWISE, OnRotate90Closewise)
ON_COMMAND(ID_ROTATE_90_NOCLOCKWISE, OnRotate90Noclockwise)
ON_COMMAND(ID_ROTATE_180, OnRotate180)
ON_COMMAND(ID_ROTATE_FREE, OnRotateFree)
ON_COMMAND(ID_ROTATE_H, OnRotateH)
ON_COMMAND(ID_ROTATE_V, OnRotateV)
ON_COMMAND(ID_LOG, OnLog)
ON_COMMAND(ID_LAYER8, OnLayer8)
ON_COMMAND(IDC_SUB, OnSub)
ON_COMMAND(ID_PROPRO_SUSAN, OnProproSusan)
ON_COMMAND(ID_PROPRO_HOF, OnProproHof)
ON_COMMAND(ID_MORPH_EROSION, OnMorphErosion)
ON_COMMAND(ID_MORPH_DILATION, OnMorphDilation)
ON_COMMAND(ID_MORPH_OPEN, OnMorphOpen)
ON_COMMAND(ID_MORPH_CLOSE, OnMorphClose)
ON_COMMAND(ID_MORPH_THINING, OnMorphThining)
ON_COMMAND(ID_EDGE_CONTOUR, OnEdgeContour)
ON_COMMAND(ID_EDGE_FILL2, OnEdgeFill2)
ON_COMMAND(ID_EDGE_FILL, OnEdgeFill)
ON_COMMAND(IDM_MATH_AND, OnMathAnd)
ON_COMMAND(IDM_MATH_NOT, OnMathNot)
ON_COMMAND(IDM_MATH_OR, OnMathOr)
ON_COMMAND(IDM_MATH_XOR, OnMathXor)
ON_COMMAND(IDM_EXTRA_DIGIMG, OnExtraDigimg)
ON_COMMAND(IDM_PROCESS, OnProcess)
ON_COMMAND(IDM_EXTRA_FINDPORT, OnExtraFindport)
ON_COMMAND(IDM_FIND_POINT, OnFindPoint1)
ON_COMMAND(IDM_FIND_MONI_PORT, OnFindMoniPort)
ON_COMMAND(IDM_CUT_REFERENCE, OnCutReference)
ON_COMMAND(IDM_RECOGNITION, OnRecognition)
ON_COMMAND(IDM_FINDPOINT, OnFindpoint)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanDoc construction/destruction
CLinjunjuanDoc::CLinjunjuanDoc()
{
flagpic=FALSE;
flagFourier=FALSE;
flagRadon=FALSE;
orgpic.p=NULL;
oldpic.p=NULL;
m_hDIB = NULL;
m_palDIB = NULL;
rate=1;
Historystep=-1;
dealnum=-1;
flagchange=FALSE;
flagsmall_big=FALSE;
anotherflag=FALSE;
for (int i=0;i<100;i++)
History[i].p=NULL;
}
CLinjunjuanDoc::~CLinjunjuanDoc()
{
if (orgpic.p!=NULL)
{
::dspace_2d(orgpic.p,orgpic.row,orgpic.col);
}
if (oldpic.p!=NULL)
{
::dspace_2d(oldpic.p,oldpic.row,oldpic.col);
}
if (m_hDIB != NULL)
{
::GlobalFree((HGLOBAL) m_hDIB);
}
if (m_palDIB != NULL)
{
delete m_palDIB;
}
for (int i=0;i<100;i++)
{
if (History[i].p!=NULL)
{
dspace_2d(History[i].p,History[i].row,History[i].col);
}
}
}
BOOL CLinjunjuanDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
theApp.m_Pot+=CSize(20,20);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanDoc serialization
void CLinjunjuanDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanDoc diagnostics
#ifdef _DEBUG
void CLinjunjuanDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CLinjunjuanDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLinjunjuanDoc commands
void CLinjunjuanDoc::OnSobel()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
KERNEL kex,key;
SobelDialogBox dlg;
if (dlg.DoModal()==IDOK)
{
kex=dlg.kerx;
key=dlg.kery;
}
else return;
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=::fspace_2d(orgpic.row,orgpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
//处理过程
::Sobel(orgpic,kex,key,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::InitDIBData()
{
if (m_palDIB != NULL)
{
delete m_palDIB;
m_palDIB = NULL;
}
if (m_hDIB == NULL)
{
return;
}
// Set up document size
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
if (::DIBWidth(lpDIB) > INT_MAX ||::DIBHeight(lpDIB) > INT_MAX)
{
::GlobalUnlock((HGLOBAL) m_hDIB);
::GlobalFree((HGLOBAL) m_hDIB);
m_hDIB = NULL;
CString strMsg;
strMsg = "IDS_DIB_TOO_BIG";
MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
return;
}
// m_sizeDoc = CSize((int) ::DIBWidth(lpDIB), (int) ::DIBHeight(lpDIB));
::GlobalUnlock((HGLOBAL) m_hDIB);
// Create copy of palette
m_palDIB = new CPalette;
if (m_palDIB == NULL)
{
// we must be really low on memory
::GlobalFree((HGLOBAL) m_hDIB);
m_hDIB = NULL;
return;
}
if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)
{
// DIB may not have a palette
delete m_palDIB;
m_palDIB = NULL;
return;
}
flagsmall_big=TRUE;
}
BOOL CLinjunjuanDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
int row,col;
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
orgpic.p=::InputImageWithName((char *)lpszPathName,row , col );
if (orgpic.p==NULL)
{
flagpic=FALSE;
return FALSE;
}
oldpic.col=orgpic.col=col;
oldpic.row=orgpic.row=row;
m_aver=Average(&orgpic);
SaveHistory();
oldpic.p=::fspace_2d(row,col);
if (oldpic.p==NULL)
{
::dspace_2d(orgpic.p,orgpic.row,orgpic.col);
return NULL;
}
for (int i=0;i<row;i++)
for (int j=0;j<col;j++)
{
oldpic.p[i][j]=orgpic.p[i][j];
}
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
return FALSE;
InitDIBData();
flagpic=TRUE;
theApp.m_Pot+=CSize(20,20);
return TRUE;
}
void CLinjunjuanDoc::OnLap()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
KERNEL ke;
LapDialogBox dlg;
if (dlg.DoModal()==IDOK)
{
ke=dlg.ker;
}
else return;
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
::Laplacian(orgpic,ke,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::OnFitItself()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
::Fit_itself(orgpic,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::OnNoclear()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
::Noclear(orgpic,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::OnFilterMed()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
::Fliter_Med(orgpic,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::OnHistogramEqualization()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
::HistogramEqualization(orgpic,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::OnOstu()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
::Ostu(orgpic,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::OnFourier()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
int rank0,rank1;
rank0=(int)(log(orgpic.row)/log(2));
rank1=(int)(log(orgpic.col)/log(2));
if (pow(2,rank0)!=orgpic.row||pow(2,rank1)!=orgpic.col)
{
AfxMessageBox("图象大小不是2的倍数,不适合2FFT!");
return;
}
cData=new complex *[orgpic.row];
for (int k=0;k<orgpic.row;k++)
cData[k]=new complex [orgpic.col];
if (!cData)
return;
for (int i=0;i<orgpic.row;i++)
for (int j=0;j<orgpic.col;j++)
{
cData[i][j].real=orgpic.p[i][j];
cData[i][j].imag=0;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
flagFourier=TRUE;
::Fourier(orgpic,cData);
//==========显示========
double temp1=0,max=0,min=255;
BYTE temp;
for(i=0;i<orgpic.row;i++)
for(int j=0;j<orgpic.col;j++)
{
temp1=log(sqrt(cData[i][j].real*cData[i][j].real+cData[i][j].imag*cData[i][j].imag)+1); //取模值中的最大和最小值
if(temp1>max) max=temp1;
if(temp1<min) min=temp1;
}
max=max-min;
if(max==0)
{
AfxMessageBox("The image maybe all 0!");
return;
}
for(i=0;i<orgpic.row;i++)
for(int j=0;j<orgpic.col;j++)
dealpic.p[i][j]=(BYTE) 255*(log(sqrt(cData[i][j].real*cData[i][j].real+cData[i][j].imag*cData[i][j].imag)+1)-min)/max; //将模值做非线性变换
for(i=0; i<orgpic.row; i++) //矩阵调整 利于显示
for(int j=0; j<orgpic.col/2; j++)
{
temp = dealpic.p[i][orgpic.col/2+j];
dealpic.p[i][orgpic.col/2+ j] = dealpic.p[i][j];
dealpic.p[i][j] = temp;
}
for(i=0; i<orgpic.row/2; i++)
for(int j=0; j<orgpic.col; j++)
{
temp = dealpic.p[orgpic.row/2 + i][j];
dealpic.p[orgpic.col/2+i][j] = dealpic.p[i][j];
dealpic.p[i][j] = temp;
}
//===============
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::OnIfft()
{
if (flagFourier)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -