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

📄 lfilterdlg.cpp

📁 可调节自适应滤波器-代码.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// LFilterDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Rader.h"
#include "RaderDoc.h"
#include "RaderView.h"
#include "LFilterDlg.h"
#include "Math.h"
#include "MainFrm.h"
#include "ModelDlg.h"
#include "Model2Dlg.h"
#include "Model4Dlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// LFilterDlg dialog


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

	m_pData = m_pView->m_pImageData;
	m_pShowData = NULL;
	m_dwLeft = m_pView->m_dwLeft;
	m_dwTop = m_pView->m_dwTop;
	m_dwWidth = m_pView->m_dwWidth;
	m_dwHeight = m_pView->m_dwHeight;
	m_dwImageWidth = m_pView->GetDocument()->m_dwWidth;
	m_dwImageHeight = m_pView->GetDocument()->m_dwHeight;
	m_pBmi = m_pView->m_pBmi;

	CPoint *pPoint;
	pPoint = new CPoint(0,0);
	m_aPoints.Add(pPoint);
	//pPoint = new CPoint(20,0);
	//m_aPoints.Add(pPoint);
	//pPoint = new CPoint(230,100);
	//m_aPoints.Add(pPoint);
	pPoint = new CPoint(255,100);
	m_aPoints.Add(pPoint);
	m_bTrace = FALSE;
	
	m_nModel = m_pView->GetDocument()->m_nModel;
    sd_max = -1.0;
	sd_min = 1.7E+308;
	m_pAverage=NULL;
	dSd=NULL;
	m_dwTemplateSize=5;
	m_tempSize=1;
	m_bMidValue = FALSE;
}
LFilterDlg::~LFilterDlg()
{
	if(m_pShowData != NULL)
	{
		delete m_pShowData;
		m_pShowData = NULL;
	}
	CPoint *pPoint;
	for(int i=0;i<m_aPoints.GetSize();i++)
	{
		pPoint = (CPoint *)(m_aPoints[i]);
		delete pPoint;
	}
	m_aPoints.RemoveAll();

	if(m_pAverage!=NULL)
	{
		delete[] m_pAverage;
		m_pAverage = NULL;
	}
	if(dSd!=NULL)
	{
		delete[] dSd;
		dSd = NULL;
	}
}
void LFilterDlg::InvalidateDlg()
{
	CRect	rectClient, rect;
	GetClientRect(&rectClient);
	rect.left = rectClient.left;
	rect.top = rectClient.top + 105;
	rect.right = rectClient.right;
	rect.bottom = rectClient.bottom;

	m_pData = m_pView->m_pImageData;
	m_dwLeft = m_pView->m_dwLeft;
	m_dwTop = m_pView->m_dwTop;
	m_dwWidth = m_pView->m_dwWidth;
	m_dwHeight = m_pView->m_dwHeight;
	if(m_pShowData != NULL)
	{
		delete m_pShowData;
		m_pShowData = NULL;
	}
	//根据窗口大小付值...
	m_pShowData = new UNDATA[m_dwWidth * m_dwHeight];
	for(DWORD i=0; i<m_dwWidth * m_dwHeight; i++)
		m_pShowData[i] = m_pData[i];
	InvalidateRect(&rect);
}
void LFilterDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(LFilterDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(LFilterDlg, CDialog)
	//{{AFX_MSG_MAP(LFilterDlg)
	ON_WM_PAINT()
	ON_COMMAND(ID_EXIT, OnExit)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_COMMAND(ID_CHANGE_SMALL, OnChangeSmall)
	ON_COMMAND(ID_CHANGE_MODEL, OnChangeModel)
	ON_COMMAND(ID_CURVE_DFFAULT, OnCurveDefault)
	ON_COMMAND(ID_CURVE_OPEN, OnCurveOpen)
	ON_COMMAND(ID_CURVE_SAVE, OnCurveSave)
	ON_COMMAND(ID_CHANGE_LARGE, OnChangeLarge)
	ON_COMMAND(ID_CHANGE_SMALL_ONE, OnChangeSmallOne)
	ON_COMMAND(ID_CHANGE_LARGE_ONE, OnChangeLargeOne)
	ON_COMMAND(ID_CHANGE_THREE_SETUP, OnChangeThreeSetup)
	ON_COMMAND(ID_CHANGE_THREE_SMALL, OnChangeThreeSmall)
	ON_COMMAND(ID_CHANGE_THREE_LARGE, OnChangeThreeLarge)
	ON_COMMAND(ID_CHANGE_FOUR_SETUP, OnChangeFourSetup)
	ON_COMMAND(ID_CHANGE_FOUR_SMALL, OnChangeFourSmall)
	ON_COMMAND(ID_CHANGE_FOUR_LARGE, OnChangeFourLarge)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// LFilterDlg message handlers

void LFilterDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	DrawHist(&dc);

	DWORD	i, j;
	UNDATA	dwTemp;
	LPBYTE pImage = new BYTE[m_dwWidth * m_dwHeight];
	for(i = 0; i < m_dwHeight; i++)
		for(j = 0; j < m_dwWidth; j++)
		{
			if(sizeof(UNDATA) == sizeof(DWORD))
				dwTemp = (UNDATA)(m_pShowData[(m_dwHeight - 1 - i) * m_dwWidth + j] / pow(2, 24));//UNDATA 
			else if(sizeof(UNDATA) == sizeof(unsigned short))
				dwTemp = (UNDATA)(m_pShowData[(m_dwHeight - 1 - i) * m_dwWidth + j] / pow(2, 8));//UNDATA 
			else if(sizeof(UNDATA) == sizeof(BYTE))
				dwTemp = (UNDATA)(m_pShowData[(m_dwHeight - 1 - i) * m_dwWidth + j]);
			else
				ASSERT(FALSE);
			
			ASSERT(dwTemp < 256);
			pImage[i * m_dwWidth + j] = (BYTE)dwTemp;
		}
	int ret;
	ret = ::StretchDIBits(
			dc.m_hDC,		// handle of device context 
			10,				// x-coordinate of upper-left corner of dest. rect. 
			110,				// y-coordinate of upper-left corner of dest. rect. 
			m_dwWidth,//m_pBmi->bmiHeader.biWidth,	// width of destination rectangle 
			m_dwHeight,//m_pBmi->bmiHeader.biHeight,	// height of destination rectangle 
			0,				// x-coordinate of upper-left corner of source rect. 
			0,				// y-coordinate of upper-left corner of source rect. 
			m_dwWidth,//m_pBmi->bmiHeader.biWidth,	// width of source rectangle 
			m_dwHeight,//m_pBmi->bmiHeader.biHeight,	// height of source rectangle 
			pImage,	// address of bitmap data
			m_pBmi,	// address of bitmap bits 
			DIB_RGB_COLORS,	// usage 
			SRCCOPY			// raster operation code 				) ;
		);
	delete[] pImage;

	ASSERT(ret != 0);
}
BOOL LFilterDlg::Create() 
{
	return CDialog::Create(LFilterDlg::IDD,m_pView);
}
void LFilterDlg::OnExit() 
{
	m_pView->PostMessage(WM_COMMAND, ID_LFILTER_TWO, 0L);	
}

void LFilterDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	int x;
	int y;

	RECT Rect;
	//SetRect(&Rect,7,7,117,117);
	SetRect(&Rect,5,5,133,52);
	MapDialogRect(&Rect);

	if(point.x<Rect.left||point.y>Rect.right||point.y<Rect.top||point.y>Rect.bottom)
		return;
	x = (point.x-Rect.left)*255/(Rect.right-Rect.left);
	y = (Rect.bottom-point.y)*100/(Rect.bottom-Rect.top);

	CPoint *pPoint;
	CPoint *pNextPoint;
	for(int i=1;i<m_aPoints.GetSize()-1;i++)
	{
		pPoint = (CPoint *)(m_aPoints[i]);
		if(abs(pPoint->x-x)<=5&&abs(pPoint->y-y)<=5)
			break;
	}
	if(i == m_aPoints.GetSize()-1)
	{
		for(int i=0;i<m_aPoints.GetSize()-1;i++)
		{
			pPoint = (CPoint *)(m_aPoints[i]);
			pNextPoint = (CPoint *)(m_aPoints[i+1]);
			if(pPoint->x<x&&pNextPoint->x>x)
				break;
		}
		if(i<m_aPoints.GetSize()-1)
		{
			pPoint = new CPoint(x,y);
			m_aPoints.InsertAt(i+1,pPoint);
			InvalidateRect(&Rect);
		}
		SetCursor(AfxGetApp()->LoadCursor(IDC_POINTEDIT_DRAG1));
	}
	else
	{
		SetCapture();
		m_bTrace = TRUE;

		m_nSelPoint = i;

		pPoint = (CPoint *)(m_aPoints[i-1]);
		pNextPoint = (CPoint *)(m_aPoints[i+1]);

		double dRatioX = (double)(Rect.right-Rect.left)/255;
		double dRatioY = (double)(Rect.bottom-Rect.top)/100;

		int x1 = (int)(pPoint->x*dRatioX+Rect.left);
		int x2 = (int)(pNextPoint->x*dRatioX+Rect.left);

		RECT ClipRect;
		SetRect(&ClipRect,x1,Rect.top,x2,Rect.bottom);
		ClientToScreen(&ClipRect);
		ClipCursor(&ClipRect);
		SetCursor(AfxGetApp()->LoadCursor(IDC_POINTEDIT_DRAG2));
	}

	//GetK();
	CDialog::OnLButtonDown(nFlags, point);
}

void LFilterDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	int x;
	int y;

	RECT Rect;
	//SetRect(&Rect,7,7,117,117);
	SetRect(&Rect,5,5,133,52);
	MapDialogRect(&Rect);

	if(point.x<Rect.left||point.y>Rect.right||point.y<Rect.top||point.y>Rect.bottom)
		return;
	x = (int)((point.x-Rect.left)*255/(double)(Rect.right-Rect.left));
	y = (int)((Rect.bottom-point.y)*100/(double)(Rect.bottom-Rect.top));

	//SetDlgItemInt(IDC_STATIC1,x);
	//SetDlgItemInt(IDC_STATIC2,y);
	
	CPoint *pPoint;
	if(m_bTrace)
	{
		pPoint = (CPoint *)(m_aPoints[m_nSelPoint]);
		pPoint->x = x;
		pPoint->y = y;
		
		InvalidateRect(&Rect);
		SetCursor( AfxGetApp()->LoadCursor( IDC_POINTEDIT_DRAG2 ) );
	}
	else
		SetCursor( AfxGetApp()->LoadCursor( IDC_POINTEDIT_DRAG1 ) );

	
	//GetK();
	CDialog::OnMouseMove(nFlags, point);
}

void LFilterDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bTrace)
	{
		ReleaseCapture();
		m_bTrace = FALSE;
		
		ClipCursor(NULL);
	}
	SetCursor( AfxGetApp()->LoadCursor( IDC_POINTEDIT_DRAG1 ) );
	
	CDialog::OnLButtonUp(nFlags, point);
}
void LFilterDlg::DrawHist(CDC* pDC)
{
	pDC->MoveTo(9,8);
	pDC->LineTo(255+10+1,8);
	pDC->LineTo(255+10+1,100);
	pDC->LineTo(9,100);
	pDC->LineTo(9,8);
	//直方图
	RECT Rect;
	//SetRect(&Rect,7,7,117,117);
	SetRect(&Rect,5,5,133,52);
	MapDialogRect(&Rect);

	CPoint *pPoint;
	double dRatioX = (double)(Rect.right-Rect.left)/255;
	double dRatioY = (double)(Rect.bottom-Rect.top)/100;
	int x;
	int y;

	CPen BlackPen(PS_SOLID,1,RGB(0,0,0));
	CPen BluePen(PS_SOLID,1,RGB(0,0,255));
	CBrush BlueBrush(RGB(0,0,255));
	CPen *pOldPen;
	CBrush *pOldBrush;

	int i;
	for(i=0; i<256; i++)
	{
		x = (int)(i * dRatioX + Rect.left);
		y = (int)(Rect.bottom - m_HistData[i] * dRatioY);
		pDC->MoveTo(x, Rect.bottom);
		pDC->LineTo(x, y);

	}
	for(i=0;i<m_aPoints.GetSize();i++)
	{
		pPoint = (CPoint *)(m_aPoints[i]);
		x = (int)(pPoint->x*dRatioX+Rect.left);
		y = (int)(Rect.bottom - pPoint->y*dRatioY);

		if(i!=0&&i!=m_aPoints.GetSize()-1)
		{
			pOldPen = pDC->SelectObject(&BluePen);
			pOldBrush = pDC->SelectObject(&BlueBrush);
			pDC->Ellipse(x-2,y-2,x+2,y+2);
			pDC->SelectObject(pOldPen);
			pDC->SelectObject(pOldBrush);
		}

		if(i==0)
		{
			pDC->MoveTo(x,y);
		}
		else
		{
			pOldPen = pDC->SelectObject(&BlackPen);
			pDC->LineTo(x,y);
			pDC->SelectObject(pOldPen);
		}
	}

//	for(i=0;i<255;i++)
//	{
//		pDC->MoveTo(i + 10, 10 + (int)(m_K[i]*90));
//		pDC->LineTo(i + 11, 10 + (int)(m_K[i+1]*90));
//	}
}

BOOL LFilterDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	//打开文件
	CFile	f;
	CFileException e;
	DWORD	i, j;
	DWORD	dFileLength;
	//double	ColorData[256];
	for( i=0; i<256; i++)
	{
		m_ColorData[i] = 0;
	}
	if(!f.Open(m_pView->GetDocument()->m_szFilePath,CFile::modeRead,&e))
	{
		AfxMessageBox("Cannot Open file!");
		return FALSE;
	}
	dFileLength=f.GetLength();
	UNDATA	dwTemp;

	BeginWaitCursor();
	CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
	pMainFrame->SetStatusBarText(0, "Start Calculate Histogram...");
	pMainFrame->OnProcessBegin();

	//统计直方图,读取全图...
	UNDATA*	pData = new UNDATA[m_dwImageWidth];
	for(i = 0; i < m_dwImageHeight; i++)
	{
		VERIFY(f.Read(pData, m_dwImageWidth * sizeof(UNDATA)));
		for(j = 0; j < m_dwImageWidth; j++)
		{
			if(sizeof(UNDATA) == sizeof(DWORD))
				dwTemp = (UNDATA)(pData[j] / pow(2, 24)); //UNDATA
			else if(sizeof(UNDATA) == sizeof(unsigned short))
				dwTemp = (UNDATA)(pData[j] / pow(2, 8)); //UNDATA
			else if(sizeof(UNDATA) == sizeof(BYTE))
				dwTemp = (UNDATA)(pData[j]);
			else
				ASSERT(FALSE);
			
			ASSERT(dwTemp < 256);
			m_ColorData[dwTemp]++;
		}
		pMainFrame->OnProcessUpdate(i, m_dwImageHeight);
	}
	delete[] pData;

	pMainFrame->OnProcessEnd(i, m_dwImageHeight);
	pMainFrame->SetStatusBarText(0, "");
	f.Close();
	EndWaitCursor();
	double	dMax = 0;
	for( i=0; i<256; i++)
	{
		if(dMax < m_ColorData[i])
			dMax = m_ColorData[i];
	}
	for( i=0; i<256; i++)
	{
		m_ColorData[i] = m_ColorData[i] / dMax;
		m_HistData[i] = (BYTE)(m_ColorData[i] * 100.0); 
	}

	OnCurveDefault();
	//根据窗口大小,付值...
	ASSERT(m_pShowData == NULL);
	m_pShowData = new UNDATA[m_dwWidth * m_dwHeight];
	for(i=0; i<m_dwWidth * m_dwHeight; i++)
		m_pShowData[i] = m_pView->m_pImageData[i];
	
	return TRUE;
}

double LFilterDlg::GetK()
{
	CRaderDoc*	pDoc = m_pView->GetDocument();
	ASSERT_VALID(pDoc);

	double	ret;
	int		i, j;
	CPoint*	pPoint1;
	CPoint*	pPoint2;
	int		x1, y1, x2, y2;
	double	k, b;
	//正规化
	for(i=0; i<m_aPoints.GetSize()-1; i++)
	{
		pPoint1 = (CPoint *)(m_aPoints[i   ]);
		pPoint2 = (CPoint *)(m_aPoints[i + 1]);
		x1 = (int)pPoint1->x;
		x2 = (int)pPoint2->x;
		if(x2 <= x1)
			pPoint2->x = pPoint1->x + 1;
	}
	for(i=0; i<m_aPoints.GetSize()-1; i++)
	{
		pPoint1 = (CPoint *)(m_aPoints[i   ]);
		pPoint2 = (CPoint *)(m_aPoints[i + 1]);
		x1 = (int)pPoint1->x;
		y1 = (int)pPoint1->y;
		x2 = (int)pPoint2->x;
		y2 = (int)pPoint2->y;
		if(x2 <= x1)//计算误差
		{
			ASSERT(FALSE);
			x2 = x1 + 1;
			pDoc->m_K[x1] = y1;
		}
		else
		{
			for(j=x1; j<=x2; j++)
			{
				k = double(y2-y1)/double(x2-x1);
				b = y2 - k * x2;
				//pDoc->m_K[j] = (k * j + b)/100.0;
				pDoc->m_K[j] = (y2-(x2-j)*(y2-y1)/(x2-x1))/100.0;
				//ASSERT(m_K[j] >= 0);
			}
		}
	}
	return ret;
}

void LFilterDlg::OnChangeLarge() 
{
	CRaderDoc*	pDoc = m_pView->GetDocument();
	ASSERT_VALID(pDoc);

	CFileDialog dlg( FALSE, "*.dat", NULL, 
							OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
	 						"Radar Image(*.dat) | *.dat"
							"||");

	if(IDOK != dlg.DoModal())	return;

	GetK();
	BeginWaitCursor();
	pDoc->CalculateAvrAndSd();	
	if(pDoc->m_bOutFile)
		pDoc->LeeFilter2(dlg.GetPathName(), true);
	else
		pDoc->LeeFilter2(dlg.GetPathName(), false);
	EndWaitCursor();
}
void LFilterDlg::OnChangeSmall() 
{
	CRaderDoc*	pDoc = m_pView->GetDocument();
	ASSERT_VALID(pDoc);
	m_pData = m_pView->m_pImageData;
	ASSERT(m_pShowData != NULL);

	BeginWaitCursor();
	GetK();
	CalculateSD(m_nModel);
	RadarImageLFilter2(pDoc->m_bOutFile);//m_ptStart,m_ptEnd);
	EndWaitCursor();

	Invalidate();
}
BOOL LFilterDlg::RadarImageLFilter2(BOOL bIs5)//const CPoint ptStart, const CPoint ptEnd)

⌨️ 快捷键说明

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