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

📄 filterdlg.cpp

📁 基于小波的SAR斑点处理
💻 CPP
字号:
// FilterDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RSIP.h"
#include "FilterDlg.h"
#include "math.h"

#define FILTERPAR1 0.414
#define FILTERPAR2 -0.347

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

/////////////////////////////////////////////////////////////////////////////
// CFilterDlg dialog


CFilterDlg::CFilterDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFilterDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFilterDlg)
	m_nFilterType = 0;
	m_nFilterWndSize = 0;
	//}}AFX_DATA_INIT
}


void CFilterDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFilterDlg)
	DDX_Radio(pDX, ID_FILTER_MEAN, m_nFilterType);
	DDX_CBIndex(pDX, IDC_FILTERSIZE_COMBO, m_nFilterWndSize);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CFilterDlg, CDialog)
	//{{AFX_MSG_MAP(CFilterDlg)
		// NOTE: the ClassWizard will add message map macros here
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFilterDlg message handlers




/////////////////////////////////////////////////////////////////////////////
// CFrequencyFilterDlg dialog


CFrequencyFilterDlg::CFrequencyFilterDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFrequencyFilterDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFrequencyFilterDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CFrequencyFilterDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFrequencyFilterDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CFrequencyFilterDlg, CDialog)
	//{{AFX_MSG_MAP(CFrequencyFilterDlg)
	ON_BN_CLICKED(IDC_HIGHPASS, OnHighpass)
	ON_BN_CLICKED(IDC_LOWPASS, OnLowpass)
	ON_BN_CLICKED(IDC_BANDPASS, OnBandpass)
	ON_BN_CLICKED(IDC_RECTANGLE, OnRectangle)
	ON_BN_CLICKED(IDC_CIRCLE, OnCircle)
	ON_BN_CLICKED(IDC_BUTTERWORTH, OnButterworth)
	ON_BN_CLICKED(IDC_EXPONENTIAL, OnExponential)
	ON_EN_CHANGE(IDC_R1, OnChangeR1)
	ON_EN_CHANGE(IDC_R2, OnChangeR2)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFrequencyFilterDlg message handlers

void CFrequencyFilterDlg::OnHighpass() 
{
	if(m_nFilterType == 0)
		return;
	m_nFilterType = 0;
	GetDlgItem(IDC_BUTTERWORTH)->EnableWindow(TRUE);
	GetDlgItem(IDC_EXPONENTIAL)->EnableWindow(TRUE);

	GetDlgItem(IDC_R2)->EnableWindow(FALSE);

	RECT Rect;
	SetRect(&Rect,101,66,197,137);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect);
}

void CFrequencyFilterDlg::OnLowpass() 
{
	if(m_nFilterType == 1)
		return;
	m_nFilterType = 1;
	GetDlgItem(IDC_BUTTERWORTH)->EnableWindow(TRUE);
	GetDlgItem(IDC_EXPONENTIAL)->EnableWindow(TRUE);

	GetDlgItem(IDC_R2)->EnableWindow(FALSE);

	RECT Rect;
	SetRect(&Rect,101,66,197,137);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect);
}

void CFrequencyFilterDlg::OnBandpass() 
{
	if(m_nFilterType == 2)
		return;
	m_nFilterType = 2;
	GetDlgItem(IDC_BUTTERWORTH)->EnableWindow(FALSE);
	GetDlgItem(IDC_EXPONENTIAL)->EnableWindow(FALSE);
	
	CheckRadioButton(IDC_RECTANGLE,IDC_EXPONENTIAL,IDC_RECTANGLE);
	m_nFilterFunction = 0;
	
	GetDlgItem(IDC_R2)->EnableWindow(TRUE);

	RECT Rect;
	SetRect(&Rect,101,66,197,137);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect);
}

void CFrequencyFilterDlg::OnRectangle() 
{
	if(m_nFilterFunction == 0)
		return;
	m_nFilterFunction = 0;

	RECT Rect;
	SetRect(&Rect,101,66,197,137);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect);
}

void CFrequencyFilterDlg::OnCircle() 
{
	if(m_nFilterFunction == 1)
		return;
	m_nFilterFunction = 1;

	RECT Rect;
	SetRect(&Rect,101,66,197,137);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect);
}

void CFrequencyFilterDlg::OnButterworth() 
{
	if(m_nFilterFunction == 2)
		return;
	m_nFilterFunction = 2;

	RECT Rect;
	SetRect(&Rect,101,66,197,137);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect);
}

void CFrequencyFilterDlg::OnExponential() 
{
	if(m_nFilterFunction == 3)
		return;
	m_nFilterFunction = 3;

	RECT Rect;
	SetRect(&Rect,101,66,197,137);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect);	
}

void CFrequencyFilterDlg::OnChangeR1() 
{
	m_nRadias1 = GetDlgItemInt(IDC_R1);
	if(m_nRadias1<=0 || m_nRadias1>m_nSize/2)
		return;

	if(m_nRadias1 < m_nRadias2)
	{
		int nTemp;
		nTemp = m_nRadias1;
		m_nRadias1 = m_nRadias2;
		m_nRadias2 = nTemp; 
	}
	RECT Rect;
	SetRect(&Rect,101,66,197,137);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect);
}

void CFrequencyFilterDlg::OnChangeR2() 
{
	m_nRadias2 = GetDlgItemInt(IDC_R2);
	if(m_nRadias2<=0 || m_nRadias2>m_nSize/2)
		return;

	if(m_nRadias1 < m_nRadias2)
	{
		int nTemp;
		nTemp = m_nRadias1;
		m_nRadias1 = m_nRadias2;
		m_nRadias2 = nTemp; 
	}
	RECT Rect;
	SetRect(&Rect,101,66,197,137);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect);
}

BOOL CFrequencyFilterDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	CheckDlgButton(IDC_HIGHPASS,1);
	CheckDlgButton(IDC_RECTANGLE,1);
	m_nFilterFunction = 0;
	m_nFilterType = 0;
	m_nRadias1 = m_nSize/3;
	m_nRadias2 = m_nSize/3/2;
	SetDlgItemInt(IDC_R1,m_nRadias1);
	SetDlgItemInt(IDC_R2,m_nRadias2);

	GetDlgItem(IDC_R2)->EnableWindow(FALSE);
	
	return TRUE;
}

void CFrequencyFilterDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	RECT Rect;
	SetRect(&Rect,101,66,197,137);
	MapDialogRect(&Rect);
	
	if(m_nFilterFunction == 0)	//Rect
	{
		int CenterX = (Rect.left+Rect.right)/2;
		int CenterY = (Rect.top+Rect.bottom)/2;
		int Width = (Rect.bottom-Rect.top-20)/2;
		float Ratio = (float)(Width*2)/m_nSize;
		CPen Pen(PS_SOLID,2,RGB(0,0,0));
		CPen *pOldPen = dc.SelectObject(&Pen);
		dc.MoveTo(CenterX-Width,CenterY-Width);
		dc.LineTo(CenterX+Width,CenterY-Width);
		dc.LineTo(CenterX+Width,CenterY+Width);
		dc.LineTo(CenterX-Width,CenterY+Width);
		dc.LineTo(CenterX-Width,CenterY-Width);
		dc.SelectObject(pOldPen);
		Pen.DeleteObject();
		
		if(m_nFilterType==0||m_nFilterType==1)
		{
			Pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
			pOldPen=dc.SelectObject(&Pen);
			dc.MoveTo(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
			dc.LineTo(int(CenterX+m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
			dc.LineTo(int(CenterX+m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio));
			dc.LineTo(int(CenterX-m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio));
			dc.LineTo(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
			dc.SelectObject(pOldPen);
			Pen.DeleteObject();
		}
		else
		{
			Pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
			pOldPen=dc.SelectObject(&Pen);
			dc.MoveTo(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
			dc.LineTo(int(CenterX+m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
			dc.LineTo(int(CenterX+m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio));
			dc.LineTo(int(CenterX-m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio));
			dc.LineTo(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
			dc.SelectObject(pOldPen);
			Pen.DeleteObject();

			Pen.CreatePen(PS_DOT,1,RGB(0,0,0));
			pOldPen=dc.SelectObject(&Pen);
			dc.MoveTo(int(CenterX-m_nRadias2*Ratio),int(CenterY-m_nRadias2*Ratio));
			dc.LineTo(int(CenterX+m_nRadias2*Ratio),int(CenterY-m_nRadias2*Ratio));
			dc.LineTo(int(CenterX+m_nRadias2*Ratio),int(CenterY+m_nRadias2*Ratio));
			dc.LineTo(int(CenterX-m_nRadias2*Ratio),int(CenterY+m_nRadias2*Ratio));
			dc.LineTo(int(CenterX-m_nRadias2*Ratio),int(CenterY-m_nRadias2*Ratio));
			dc.SelectObject(pOldPen);
			Pen.DeleteObject();
		}
	}
	else if(m_nFilterFunction == 1)//Circle
	{
		int CenterX = (Rect.left+Rect.right)/2;
		int CenterY = (Rect.top+Rect.bottom)/2;
		int Width = (Rect.bottom-Rect.top-20)/2;
		float Ratio = (float)(Width*2)/m_nSize;
		CPen Pen(PS_SOLID,2,RGB(0,0,0));
		CPen *pOldPen = dc.SelectObject(&Pen);
		dc.MoveTo(CenterX-Width,CenterY-Width);
		dc.LineTo(CenterX+Width,CenterY-Width);
		dc.LineTo(CenterX+Width,CenterY+Width);
		dc.LineTo(CenterX-Width,CenterY+Width);
		dc.LineTo(CenterX-Width,CenterY-Width);
		dc.SelectObject(pOldPen);
		Pen.DeleteObject();

		if(m_nFilterType==0 || m_nFilterType==1)
		{
			Pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
			pOldPen=dc.SelectObject(&Pen);
			dc.Arc(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio),
					int(CenterX+m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio),
					int(CenterX+m_nRadias1*Ratio),CenterY,
					int(CenterX+m_nRadias1*Ratio),CenterY+1);
			dc.SelectObject(pOldPen);
			Pen.DeleteObject();
		}
		else
		{
			Pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
			pOldPen=dc.SelectObject(&Pen);
			dc.Arc(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio),
					int(CenterX+m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio),
					int(CenterX+m_nRadias1*Ratio),CenterY,
					int(CenterX+m_nRadias1*Ratio),CenterY+1);
			dc.SelectObject(pOldPen);
			Pen.DeleteObject();

			Pen.CreatePen(PS_DOT,1,RGB(0,0,0));
			pOldPen=dc.SelectObject(&Pen);
			dc.Arc(int(CenterX-m_nRadias2*Ratio),int(CenterY-m_nRadias2*Ratio),
					int(CenterX+m_nRadias2*Ratio),int(CenterY+m_nRadias2*Ratio),
					int(CenterX+m_nRadias2*Ratio),CenterY,
					int(CenterX+m_nRadias2*Ratio),CenterY+1);
			dc.SelectObject(pOldPen);
			Pen.DeleteObject();
		}
	}
	else if(m_nFilterFunction == 2)//ButterWorth
	{
		int CenterX = (Rect.left+Rect.right)/2;
		int Width = (Rect.right-Rect.left-20)/2;
		float Ratio = (float)(Width*2)/m_nSize;
		int Height = Rect.bottom-Rect.top-20;
		float ThisR = m_nRadias1*Ratio;
		CPen Pen(PS_SOLID,1,RGB(0,0,0));
		CPen *pOldPen = dc.SelectObject(&Pen);
		//Draw Axis
		dc.MoveTo(CenterX-Width,Rect.bottom-10);
		dc.LineTo(CenterX+Width,Rect.bottom-10);
		dc.MoveTo(CenterX,Rect.bottom-10);
		dc.LineTo(CenterX,Rect.bottom-10-Height);
		if(m_nFilterType==1)//LowPass
		{
			dc.MoveTo(CenterX-Width,
				int(Rect.bottom-10-Height/(1+FILTERPAR1*Width*Width/ThisR/ThisR)));
			for(int i=-Width;i<=Width;i++)
				dc.LineTo(CenterX+i,
				  int(Rect.bottom-10-Height/(1+FILTERPAR1*fabs(i)*fabs(i)/ThisR/ThisR)));
		}
		else//HighPass
		{
			dc.MoveTo(CenterX-Width,
				int(Rect.bottom-10-Height/(1+FILTERPAR1/Width/Width*ThisR*ThisR)));
			for(int i=-Width;i<=Width;i++)
				dc.LineTo(CenterX+i,
					int(Rect.bottom-10-Height/(1+FILTERPAR1/(fabs(i)+0.1)/(fabs(i)+0.1)*ThisR*ThisR)));
		}
		dc.SelectObject(pOldPen);
		Pen.DeleteObject();
	}
	else//Exp
	{
		int CenterX = (Rect.left+Rect.right)/2;
		int Width = (Rect.right-Rect.left-20)/2;
		float Ratio = (float)(Width*2)/m_nSize;
		int Height = Rect.bottom-Rect.top-20;
		float ThisR = m_nRadias1*Ratio;
		CPen Pen(PS_SOLID,1,RGB(0,0,0));
		CPen *pOldPen = dc.SelectObject(&Pen);
		//Draw Axis
		dc.MoveTo(CenterX-Width,Rect.bottom-10);
		dc.LineTo(CenterX+Width,Rect.bottom-10);
		dc.MoveTo(CenterX,Rect.bottom-10);
		dc.LineTo(CenterX,Rect.bottom-10-Height);
		if(m_nFilterType==1)//LowPass
		{
			dc.MoveTo(CenterX-Width,
				int(Rect.bottom-10-Height*exp(FILTERPAR2*Width*Width/ThisR/ThisR)));
			for(int i=-Width;i<=Width;i++)
				dc.LineTo(CenterX+i,
					int(Rect.bottom-10-Height*exp(FILTERPAR2*fabs(i)*fabs(i)/ThisR/ThisR)));
		}
		else//HighPass
		{
			dc.MoveTo(CenterX-Width,
				int(Rect.bottom-10-Height*exp(FILTERPAR2/Width/Width*ThisR*ThisR)));
			for(int i=-Width;i<=Width;i++)
				dc.LineTo(CenterX+i,
					int(Rect.bottom-10-Height*exp(FILTERPAR2/(fabs(i)+0.1)/(fabs(i)+0.1)*ThisR*ThisR)));
		}
		dc.SelectObject(pOldPen);
		Pen.DeleteObject();
	}
}

void CFrequencyFilterDlg::OnOK() 
{
	if(m_nRadias1<=0 || m_nRadias1>m_nSize/2 || 
		m_nRadias2<=0 || m_nRadias2>m_nSize/2)
	{
		MessageBox("输入值错误!");
		return;
	}
	
	CDialog::OnOK();
}

⌨️ 快捷键说明

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