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

📄 linjunjuandoc.cpp

📁 图像处理软件,功能比较基础
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 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 + -