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

📄 demoview.cpp

📁 将数字图像处理的一般算法都集中在一个MFC的框架中
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  // demoView.cpp : implementation of the CDemoView class
//
#include "stdio.h"
#include "stdafx.h"
#include "demo.h"

#include "demoDoc.h"
#include "demoView.h"
#include"math.h"
#include "MainFrm.h"
#include "ImageCenterDib.h"//dib类头文件
#include "SpecialEffectShow.h"//图象的特效显示的头文件
#include "GrayTrans.h"//灰度变换类
#include "linearStretchParamDlg.h"//线性拉伸参数设置对话框
#include "histogram.h"//直方图类
#include "HistogramDrawDlg.h"//直方图绘制对话框
#include "GeometryTrans.h"//几何变换类
#include "GeometryMoveDlg.h"//平移设置对话框
#include "FFT.h"//快速傅立叶变换类
#include "Morphology.h"//形态学处理类
#include "MaskDefineDlg.h"//模板自定义对话框
#include "ThreshSegmentDlg.h"//阈值分割对话框
#include "Segment.h"//图像分割类
#include "RotateSetDlg.h"//旋转设置对话框
#include "Match.h"//匹配类
#include "NonlinearStretchDlg.h"//非线性拉伸(对数或指数)参数设置对话框
#include "RegionGrowDlg.h" //区域生长参数设置对话框
#include "Watershed.h"//水域分割类
#include "WatershedParaDlg.h"//水域分割参数设置对话框
#include "ImageRestore.h"//运动模糊恢复类
#include "ProjectRestoreDlg.h"//投影法运动模糊恢复设置对话框
#include "WienterFilterDlg.h"//维纳滤波设置对话框
#include "InverseFilterDlg.h"//逆旅滤波设置对话框
#include "transeform.h"//小波变换
#include "MedianDialog.h"//中值滤波选择模板对话框
#include "AvgDialog.h"//均值滤波选择模板对话框
#include "ImgEnhance.h"//图像增强类
#include "transform_DCT.h"//离散余弦变换
#include "Register.h"
#include "Zoomdlg.h"//缩放设置对话框
#include "Register.h"
#include "PhaseCorre.h"

//全局变量
Transform_FFT FFTTrans;//傅立叶变换类的对象
transeform_wavelet wltTrans;//小波变换类的对象
transform_DCT DIBDCT;//DCT变换类对象
ImgCenterDib DIB1;//配准算法的输入图像1
ImgCenterDib DIB2;//配准算法的输入图像2

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDemoView

IMPLEMENT_DYNCREATE(CDemoView, CScrollView)

BEGIN_MESSAGE_MAP(CDemoView, CScrollView)
	//{{AFX_MSG_MAP(CDemoView)
	ON_COMMAND(ID_SOBEL, OnSobel)
	ON_COMMAND(id_ImgReverse, OnImgReverse)
	ON_COMMAND(id_ColorToGray, OnColorToGray)
	ON_COMMAND(id_Binary, OnBinary)
	ON_COMMAND(id_GrayToColor, OnGrayToColor)
	ON_COMMAND(id_LinearStrecth, OnLinearStrecth)
	ON_COMMAND(id_HistgramAver, OnHistgramAver)
	ON_COMMAND(id_HistogramDraw, OnHistogramDraw)
	ON_COMMAND(ID_FFT, OnFft)
	ON_COMMAND(id_IFFT, OnIfft)
	ON_COMMAND(id_Clockwise90, OnClockwise90)
	ON_COMMAND(id_Anticlockwise90, OnAnticlockwise90)
	ON_COMMAND(id_Rotate180, OnRotate180)
	ON_COMMAND(id_Zoom, OnZoom)
	ON_COMMAND(id_Rotate, OnRotate)
	ON_COMMAND(id_ErosionForBinary, OnErosionForBinary)
	ON_COMMAND(ID__DilationForBinary, OnDilationForBinary)
	ON_COMMAND(id_OpenForBinary, OnOpenForBinary)
	ON_COMMAND(id_CloseForBinary, OnCloseForBinary)
	ON_COMMAND(id_InnerEdgeForBinary, OnInnerEdgeForBinary)
	ON_COMMAND(id_OuterEdgeForBinary, OnOuterEdgeForBinary)
	ON_COMMAND(id_HitMissThinning, OnHitMissThinning)
	ON_COMMAND(id_ErosionForGray, OnErosionForGray)
	ON_COMMAND(id_DilationForGray, OnDilationForGray)
	ON_COMMAND(id_OpenForGray, OnOpenForGray)
	ON_COMMAND(id_CloseForGray, OnCloseForGray)
	ON_COMMAND(id_MorphoGradientForGray, OnMorphoGradientForGray)
	ON_COMMAND(id_TopHatPeak, OnTopHatPeak)
	ON_COMMAND(id_TopHatVally, OnTopHatVally)
	ON_COMMAND(id_TopHatPeakAndVally, OnTopHatPeakAndVally)
	ON_COMMAND(id_InteractiveThresh, OnInteractiveThresh)
	ON_COMMAND(id_OtusThreshold, OnOtusThreshold)
	ON_COMMAND(id_Robert, OnRobert)
	ON_COMMAND(id_Prewitt, OnPrewitt)
	ON_COMMAND(id_EdgeSelectTemplete, OnEdgeSelectTemplete)
	ON_COMMAND(id_HoughTransform, OnHoughTransform)
	ON_COMMAND(id_LineDetectByHough, OnLineDetectByHough)
	ON_COMMAND(id_RegionGrow, OnRegionGrow)
	ON_COMMAND(id_ContourExtract, OnContourExtract)
	ON_COMMAND(id_Gauss_laplacian, OnGausslaplacian)
	ON_COMMAND(id_WatershedSegment, OnWatershedSegment)
	ON_COMMAND(id_DuiShuStretch, OnDuiShuStretch)
	ON_COMMAND(id_ZhiShuStretch, OnZhiShuStretch)
	ON_COMMAND(id_Move, OnMove)
	ON_COMMAND(id_ZhuanZhi, OnZhuanZhi)
	ON_COMMAND(id_HorizontalMirror, OnHorizontalMirror)
	ON_COMMAND(id_VerticalMirror, OnVerticalMirror)
	ON_COMMAND(id_FFTEx, OnFFTEx)
	ON_COMMAND(id_IFFTEx, OnIFFTEx)
	ON_COMMAND(id_Laplacian, OnLaplacian)
	ON_COMMAND(id_Krisch, OnKrisch)
	ON_COMMAND(id_ContourTrace, OnContourTrace)
	ON_COMMAND(id_MorphoContourForBinary, OnMorphoContourForBinary)
	ON_COMMAND(ID_SCAN, OnScan)
	ON_COMMAND(ID_SLIDE, OnSlide)
	ON_COMMAND(ID_FADEIN, OnFadeIn)
	ON_COMMAND(ID_MOSAIK, OnMosaik)
	ON_COMMAND(ID_ProjRestore, OnProjRestore)
	ON_COMMAND(ID_WienerFilter, OnWienerFilter)
	ON_COMMAND(ID_InverseFilter, OnInverseFilter)
	ON_COMMAND(ID_SET2ZERO_DENOISE, OnSet2zeroDenoise)
	ON_COMMAND(ID__HARDTHRESHOLD, OnHardthreshold)
	ON_COMMAND(ID_SOFTTHRESHOLD, OnSoftthreshold)
	ON_COMMAND(ID_PepperSaltNoise, OnPepperSaltNoise)
	ON_COMMAND(ID_Random, OnRandom)
	ON_COMMAND(ID_AveSmooth, OnAveSmooth)
	ON_COMMAND(id_MiddleSmooth, OnMiddleSmooth)
	ON_COMMAND(ID_LaplacienSharp, OnLaplacienSharp)
	ON_COMMAND(ID_CHOOSE_MASK, OnChooseMask)
	ON_COMMAND(ID_POWER_SMOOTH, OnPowerSmooth)
	ON_COMMAND(id_HarrWaveletTrans, OnHarrWaveletTrans)
	ON_COMMAND(id_HarrWaveletITrans, OnHarrWaveletITrans)
	ON_COMMAND(ID_DCT, OnDct)
	ON_COMMAND(ID_GRADESHARP, OnGradesharp)
	ON_COMMAND(ID_SNR, OnSnr)
	ON_COMMAND(id_IDCT, OnIdct)
	ON_COMMAND(ID_SECONDIMAGE, OnSecondimage)
	ON_COMMAND(ID_FIRSTIMAGE, OnFirstimage)
	ON_COMMAND(id_MatchConner, OnMatchConner)
	ON_COMMAND(id_MatchTemplet, OnMatchTemplet)
	ON_COMMAND(id_ConnerDetect, OnConnerDetect)
	ON_COMMAND(ID_MOTION_FOPEN1, OnMotionFopen1)
	ON_COMMAND(ID_MOTION_FOPEN2, OnMotionFopen2)
	ON_COMMAND(ID_MOTION_FEST, OnMotionFest)
	ON_COMMAND(ID_MITON_DEST, OnMitonDest)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDemoView construction/destruction

CDemoView::CDemoView()
{

}

CDemoView::~CDemoView()
{

}

BOOL CDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDemoView drawing

void CDemoView::OnDraw(CDC* pDC)
{

	//获取文档类指针
	CDemoDoc* pDoc = GetDocument();

	if(!pDoc->isAvi){
		//返回m_dib的指针
		ImgCenterDib *pDib=pDoc->GetPDib();

		//获取DIB的尺寸
		CSize sizeFileDib = pDib->GetDimensions();

		//显示DIB
		pDib->Draw(pDC, CPoint(0, 0), sizeFileDib);

	}
	else
	{
		
	}
}

void CDemoView::OnInitialUpdate()
{

	CScrollView::OnInitialUpdate();

	//获取文档类指针
	CDemoDoc* pDoc = GetDocument();

	//获取DIB的指针
	ImgCenterDib *pDib=pDoc->GetPDib();

	//根据DIB尺寸设置视窗大小
	if(pDib!=NULL)
    	SetScrollSizes(MM_TEXT, pDib->GetDimensions());
	else{
		//如果m_dib为空,则设置一个固定的尺寸
		CSize sizeTotal;
		sizeTotal.cx = sizeTotal.cy = 100;
		SetScrollSizes(MM_TEXT, sizeTotal);
	}
	
}

/////////////////////////////////////////////////////////////////////////////
// CDemoView printing

BOOL CDemoView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CDemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CDemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CDemoView diagnostics

#ifdef _DEBUG
void CDemoView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CDemoView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CDemoDoc* CDemoView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDemoDoc)));
	return (CDemoDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDemoView message handlers



void CDemoView::OnImgReverse() 
{
	//获取文档类指针
	CDemoDoc *pDoc=GetDocument();

	//获取ImgCenterDib类对象的指针,访问当前DIB数据
	ImgCenterDib *pDib=pDoc->GetPDib();
	
	//DIB类型判断
	if(pDib->m_nBitCount!=24&&pDib->m_nBitCount!=8){
		::MessageBox(0,"只处理彩色和灰度图像",MB_OK,0);
		return ;
	}
	
	//将pDib中的图像数据作为输入数据,调用带参数的构造函数,
	//定义GrayTrans类的对象graytrans
	GrayTrans graytrans(pDib->GetDimensions(),
		pDib->m_nBitCount,pDib->m_lpColorTable,pDib->m_pImgData);

	//调用ReverseImg()对图像求反
	graytrans.ReverseImg();
	
	//建立一个新视图,显示分割结果
	CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);

	//发送新建文件的消息,创建一个新的文档-视图
	pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
	
	//获取新建视图指针
	CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
	

	//获取相关联的新的文档类指针
	CDemoDoc* pDocNew=pView->GetDocument();

	//获取新文档中的ImgCenterDib类对象指针
	ImgCenterDib *dibNew=pDocNew->GetPDib();

	//将变换后的输出图像作为新建文档的DIB进行显示
	dibNew->ReplaceDib(graytrans.GetDimensions(),graytrans.m_nBitCountOut,graytrans.m_lpColorTableOut, graytrans.m_pImgDataOut);
	
	//设置滚动窗口
	pView->OnInitialUpdate();

	//文档数据置脏,提示存盘信息
	pDocNew->SetModifiedFlag(TRUE);

	//各视图刷新显示
	pDocNew->UpdateAllViews(pView);
}

void CDemoView::OnColorToGray() 
{
	//获取文档类指针
	CDemoDoc *pDoc=GetDocument();
	//获取ImgCenterDib类对象m_dib的指针,访问当前DIB数据
	ImgCenterDib *pDib=pDoc->GetPDib();
	
	//只处理彩色图像
	if(pDib->m_nBitCount!=24){
		::MessageBox(0,"只处理彩色图像",MB_OK,0);
		return ;
	}
	
	//将pDib中的图像数据作为输入数据,调用带参数的构造函数,
	//定义GrayTrans类的对象graytrans
	GrayTrans graytrans(pDib->GetDimensions(),pDib->m_nBitCount,
		pDib->m_lpColorTable, pDib->m_pImgData);
	
	//彩色变灰度格式
	graytrans.ColorToGray();
	
	//建立一个新视图,显示分割结果
	CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
	
	//发送新建文件的消息,创建一个新的文档-视图
	pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
	
	//获取新建视图指针
	CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
	
	//获取相关联的新的文档类指针
	CDemoDoc* pDocNew=pView->GetDocument();

	//获取新文档中的ImgCenterDib类对象指针
	ImgCenterDib *dibNew=pDocNew->GetPDib();

	//将变换后的输出图像作为新建文档的DIB进行显示
	dibNew->ReplaceDib(graytrans.GetDimensions(),graytrans.m_nBitCountOut,graytrans.m_lpColorTableOut, graytrans.m_pImgDataOut);
	
	//设置滚动窗口
	pView->OnInitialUpdate();


	//文档数据置脏,提示存盘信息
	pDocNew->SetModifiedFlag(TRUE);

	//各视图刷新显示
	pDocNew->UpdateAllViews(pView);
}

void CDemoView::OnBinary() 
{
	//获取文档类中m_dib的指针,访问当前DIB数据
	CDemoDoc *pDoc=GetDocument();
	ImgCenterDib *pDib=pDoc->GetPDib();
	
	//异常判断
	if(pDib->m_nBitCount!=24&&pDib->m_nBitCount!=8){
		::MessageBox(0,"只处理彩色和灰度图像",MB_OK,0);
		return ;
	}
	
	//将pDib中的图像数据作为输入数据,调用带参数的构造函数,
	//定义GrayTrans类的对象graytrans
	GrayTrans graytrans(pDib->GetDimensions(),pDib->m_nBitCount,
		pDib->m_lpColorTable, pDib->m_pImgData);
	
	//调用Binary()对图像进行二值化,缺省状态下阈值为
	graytrans.Binary();
	
	//建立一个新视图,显示分割结果
	CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
	pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
	CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
	CDemoDoc* pDocNew=pView->GetDocument();
	ImgCenterDib *dibNew=pDocNew->GetPDib();
	dibNew->ReplaceDib(graytrans.GetDimensions(),graytrans.m_nBitCountOut,graytrans.m_lpColorTableOut, graytrans.m_pImgDataOut);
	pView->OnInitialUpdate();	
	pDocNew->SetModifiedFlag(TRUE);
	pDocNew->UpdateAllViews(pView);
}

void CDemoView::OnGrayToColor() 
{
	//获取文档类中m_dib的指针,访问当前DIB数据
	CDemoDoc *pDoc=GetDocument();
	ImgCenterDib *pDib=pDoc->GetPDib();
	
	//只处理灰度图像
	if(pDib->m_nBitCount!=8){
		::MessageBox(0,"只处理灰度图像",MB_OK,0);
		return ;
	}
	
	//将pDib中的图像数据作为输入数据,调用带参数的构造函数,
	//定义GrayTrans类的对象graytrans

⌨️ 快捷键说明

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