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

📄 lfilterdlg.cpp

📁 可调节自适应滤波器-代码.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	if(IDOK != dlg.DoModal())	return;

	CPoint *pPoint;
	CFile f;
	CFileException e;
	DWORD	i;

	for(i=0;i<(DWORD)m_aPoints.GetSize();i++)
	{
		pPoint = (CPoint *)(m_aPoints[i]);
		delete pPoint;
	}
	m_aPoints.RemoveAll();

	if(!f.Open(dlg.GetPathName(),CFile::modeRead,&e))
	{
		AfxMessageBox("Cannot Open file!");
		return;
	}
	DWORD	dwKey, dwPointNum;
	f.Read(&dwKey, sizeof(DWORD));
	if(dwKey != 1972717)
	{
		AfxMessageBox("Not LFilter curve!");
		f.Close();
		return;
	}
	f.Read(&dwPointNum, sizeof(DWORD));
	for(i = 0; i < dwPointNum; i++)
	{
		pPoint = new CPoint;
		f.Read(pPoint, sizeof(CPoint));
		m_aPoints.Add(pPoint);	
	}
	f.Close();

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

	InvalidateRect(&Rect);
}

void LFilterDlg::OnCurveSave() 
{
	CFileDialog dlg( FALSE, "*.cuv", NULL, 
							OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
	 						"LFilter curve(*.cuv) | *.cuv"
							"||");

	if(IDOK != dlg.DoModal())	return;
	CFile f;
	CFileException e;
	CPoint *pPoint;
	if(!f.Open(dlg.GetPathName(),CFile::modeCreate | CFile::modeWrite,&e))
	{
		AfxMessageBox("Cannot Save file!");
		return;
	}
	DWORD	dwKey = 1972717;
	f.Write(&dwKey, sizeof(DWORD));
	DWORD	dwPointNum = (DWORD)m_aPoints.GetSize();
	f.Write(&dwPointNum, sizeof(DWORD));
	for(DWORD i=0;i<dwPointNum;i++)
	{
		pPoint = (CPoint *)(m_aPoints[i]);
		f.Write(pPoint, sizeof(CPoint));
	}
	f.Close();
}

void LFilterDlg::OnChangeSmallOne() 
{
	m_pData = m_pView->m_pImageData;
	ASSERT(m_pShowData != NULL);

	BeginWaitCursor();
	RadarImageLFilter1();
	EndWaitCursor();

	Invalidate();
}

void LFilterDlg::OnChangeLargeOne() 
{
	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;

	BeginWaitCursor();
	pDoc->LeeFilter1(dlg.GetPathName());
	EndWaitCursor();
}
double LFilterDlg::GetMidValue(UNDATA * pData,DWORD NumOfData, BOOL bFlag)
{
	double sum;
	UNDATA temp;
	DWORD i,j;

	//确定窗口数据存在。
	ASSERT(pData != NULL);

	if(bFlag)
	{
		//排序
		for(i = 0; i < NumOfData-1; i++)
		{
			for(j = i+1; j < NumOfData; j++)
			{
				if(pData[j] > pData[i])
				{
					temp = pData[j];
					pData[j] = pData[i];
					pData[i] = temp;
				}
			}
		}
		//返回中值。
		return (double)pData[(NumOfData-1)/2];
	}
	else
	{
		//返回均值。
		sum = 0;
		for(i = 0;i < NumOfData;i++)
			sum = sum + pData[i];
		return sum/(double)NumOfData;
	}
}
//???
double LFilterDlg::GetOutValue(UNDATA * pData,DWORD NumOfData, BOOL bFlag, DWORD m)
{
	int middle;
	double average;
	DWORD i;
	double sum;
	double k,stdDiverse;
	
	k = sqrt(NumOfData/(double)m - 1);
	middle = (NumOfData-1)/2;
	sum = 0;
	average = GetMidValue(pData,NumOfData,FALSE);//false:不排序,只求均值
	for(i = 0;i < NumOfData;i++)
		//sum = sum + fabs(pData[i] - average);
		sum = sum + (pData[i] - average)*(pData[i] - average);
	stdDiverse = k * sqrt(sum/(double)NumOfData);

	if( pData[middle] > average-stdDiverse && pData[middle] < average+stdDiverse )
	{
		return (double)pData[middle];
	}
	else
	{
		if(bFlag)
		{
			return GetMidValue(pData,NumOfData,TRUE);
		}
		else
		{
			return average;
		}
	}
}
UNDATA LFilterDlg::GetOutValue4(UNDATA * pData, DWORD NumOfData, DWORD m)
{
	ASSERT(pData != NULL);
	ASSERT(m <= (NumOfData-3)/2);

	UNDATA CurrentData = pData[(NumOfData-1)/2];
	UNDATA	Min, Max;
	UNDATA temp;
	DWORD	i, j;

	for(i = 0; i < NumOfData-1; i++)
	{
		//排序
		for(j = i+1; j < NumOfData; j++)
		{
			if(pData[j] > pData[i])
			{
				temp = pData[j];
				pData[j] = pData[i];
				pData[i] = temp;
			}
		}
	}
	Max = pData[m];
	Min = pData[NumOfData - m - 1];
	if(CurrentData <= Min)
		return Min;
	else if(CurrentData >= Max)
		return Max;
	else
		return CurrentData;
}
void LFilterDlg::OnChangeThreeSetup() 
{
	CRaderDoc*	pDoc = m_pView->GetDocument();
	ASSERT_VALID(pDoc);

	CModel2Dlg dlg;
	switch(m_nModel)
	{
	case 3:
		dlg.m_nModel = 0;
		break;
	case 5:
		dlg.m_nModel = 1;
		break;
	case 7:
		dlg.m_nModel = 2;
		break;
	case 9:
		dlg.m_nModel = 3;
		break;
	case 11:
		dlg.m_nModel = 4;
		break;
	case 13:
		dlg.m_nModel = 5;
		break;
	case 15:
		dlg.m_nModel = 6;
		break;
	default:
		ASSERT(FALSE);
		break;
	}
	if(m_bMidValue)
		dlg.m_nMid = 0;
	else
		dlg.m_nMid = 1;
	dlg.m_dwM = pDoc->m_dwM;
	if(IDOK == dlg.DoModal())
	{
		switch(dlg.m_nModel)
		{
		case 0:
			m_nModel = 3;
			break;
		case 1:
			m_nModel = 5;
			break;
		case 2:
			m_nModel = 7;
			break;
		case 3:
			m_nModel = 9;
			break;
		case 4:
			m_nModel = 11;
			break;
		case 5:
			m_nModel = 13;
			break;
		case 6:
			m_nModel = 15;
			break;
		default:
			ASSERT(FALSE);
			break;
		}
		if(dlg.m_nMid == 0)
			m_bMidValue = TRUE;
		else if(dlg.m_nMid == 1)
			m_bMidValue = FALSE;
		pDoc->m_dwM = dlg.m_dwM;
		m_pView->GetDocument()->m_nModel = m_nModel;
	}
}
void LFilterDlg::OnChangeFourSetup() 
{
	CRaderDoc*	pDoc = m_pView->GetDocument();
	ASSERT_VALID(pDoc);

	CModel4Dlg dlg;
	switch(m_nModel)
	{
	case 3:
		dlg.m_nModel = 0;
		break;
	case 5:
		dlg.m_nModel = 1;
		break;
	case 7:
		dlg.m_nModel = 2;
		break;
	case 9:
		dlg.m_nModel = 3;
		break;
	case 11:
		dlg.m_nModel = 4;
		break;
	case 13:
		dlg.m_nModel = 5;
		break;
	case 15:
		dlg.m_nModel = 6;
		break;
	default:
		ASSERT(FALSE);
		break;
	}
	dlg.m_dwM = pDoc->m_dwM4;
	if(IDOK == dlg.DoModal())
	{
		switch(dlg.m_nModel)
		{
		case 0:
			m_nModel = 3;
			break;
		case 1:
			m_nModel = 5;
			break;
		case 2:
			m_nModel = 7;
			break;
		case 3:
			m_nModel = 9;
			break;
		case 4:
			m_nModel = 11;
			break;
		case 5:
			m_nModel = 13;
			break;
		case 6:
			m_nModel = 15;
			break;
		default:
			ASSERT(FALSE);
			break;
		}
		pDoc->m_dwM4 = dlg.m_dwM;
		m_pView->GetDocument()->m_nModel = m_nModel;
	}
}
void LFilterDlg::OnChangeThreeSmall() 
{
	CRaderDoc*	pDoc = m_pView->GetDocument();
	ASSERT_VALID(pDoc);

	m_pData = m_pView->m_pImageData;
	ASSERT(m_pShowData != NULL);

	BeginWaitCursor();
	RadarImageLFilter3(m_nModel, pDoc->m_dwM);
	EndWaitCursor();

	Invalidate();
}
void LFilterDlg::RadarImageLFilter3(const DWORD dwTemplateSize, DWORD m)
{
	ASSERT(m_pData == m_pView->m_pImageData);
	DWORD i, j;
	m_dwTemplateSize = dwTemplateSize;

	m_tempSize = (m_dwTemplateSize-1) / 2;
	CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
	pMainFrame->SetStatusBarText(0, "Start calculate average value and variance...");
	pMainFrame->OnProcessBegin();
	//m_tempSize = 1, 2, 3
	UNDATA*	pData = NULL;
	pData = new UNDATA[(m_tempSize*2+1) * (m_tempSize*2+1)];
	for(i=m_tempSize;i<m_dwHeight-m_tempSize;i++)
	{
		pMainFrame->OnProcessUpdate(i-m_tempSize, m_dwHeight-m_tempSize*2);
		for(j=m_tempSize;j<m_dwWidth-m_tempSize;j++)
		{
			DWORD	dwCount = 0;
			for(UINT i1=i-m_tempSize;i1<=i+m_tempSize;i1++)
				for(UINT j1=j-m_tempSize;j1<=j+m_tempSize;j1++)
				{
					pData[dwCount] = m_pData[j1+i1*m_dwWidth];
					dwCount ++;
				}
			if(m_bMidValue)
				m_pShowData[j+i*m_dwWidth] = (UNDATA)GetOutValue(pData, (m_tempSize*2+1) * (m_tempSize*2+1), TRUE, m);
			else
				m_pShowData[j+i*m_dwWidth] = (UNDATA)GetOutValue(pData, (m_tempSize*2+1) * (m_tempSize*2+1), FALSE, m);
		}
	}
	delete[] pData;
	pMainFrame->OnProcessEnd(i-m_tempSize, m_dwHeight-m_tempSize*2);
	pMainFrame->SetStatusBarText(0, "");
	//补数据...暂时不补
	/*
	for(i=0;i<m_tempSize;i++)
	{
		//上行
		for(j=0; j<m_dwWidth; j++)
		{
			m_pShowData[i * m_dwWidth + j] = m_pShowData[(m_tempSize + i) * m_dwWidth + j];
			
		}
		//下行
		for(j=0; j<m_dwWidth; j++)
		{
			m_pShowData[(m_dwHeight-m_tempSize+i) * m_dwWidth + j] 
						= m_pShowData[(m_dwHeight-m_tempSize*2+i) * m_dwWidth + j];
			
		}
	}
	for(i=0;i<m_dwHeight;i++)
	{
		//左列
		for(j=0; j<m_tempSize; j++)
		{
			m_pShowData[i * m_dwWidth + j] = m_pShowData[i * m_dwWidth + j + m_tempSize];
		}
		//右列
		for(j=0; j<m_tempSize; j++)
		{
			m_pShowData[i * m_dwWidth + (m_dwWidth-m_tempSize+j)] = 
						m_pShowData[i * m_dwWidth + (m_dwWidth-m_tempSize*2+j)];
		}
	}*/
}

void LFilterDlg::OnChangeThreeLarge() 
{
	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;

	BeginWaitCursor();
	pDoc->LeeFilter3(dlg.GetPathName(), m_bMidValue);
	EndWaitCursor();
}
void LFilterDlg::RadarImageLFilter4(const DWORD dwTemplateSize, DWORD m)
{
	ASSERT(m_pData == m_pView->m_pImageData);
	DWORD i, j;
	m_dwTemplateSize = dwTemplateSize;

	m_tempSize = (m_dwTemplateSize-1) / 2;
	CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
	pMainFrame->SetStatusBarText(0, "Start calculate average value and variance...");
	pMainFrame->OnProcessBegin();
	//m_tempSize = 1, 2, 3
	UNDATA*	pData = NULL;
	pData = new UNDATA[(m_tempSize*2+1) * (m_tempSize*2+1)];
	for(i=m_tempSize;i<m_dwHeight-m_tempSize;i++)
	{
		pMainFrame->OnProcessUpdate(i-m_tempSize, m_dwHeight-m_tempSize*2);
		for(j=m_tempSize;j<m_dwWidth-m_tempSize;j++)
		{
			DWORD	dwCount = 0;
			for(UINT i1=i-m_tempSize;i1<=i+m_tempSize;i1++)
				for(UINT j1=j-m_tempSize;j1<=j+m_tempSize;j1++)
				{
					pData[dwCount] = m_pData[j1+i1*m_dwWidth];
					dwCount ++;
				}
				UNDATA	tempData[25];
				for(DWORD y=0; y<25; y++)
					tempData[y] = pData[y];
				m_pShowData[j+i*m_dwWidth] = GetOutValue4(pData, (m_tempSize*2+1) * (m_tempSize*2+1), m);

				for( y=0; y<25; y++)
					tempData[y] = pData[y];
		}
	}
	delete[] pData;
	pMainFrame->OnProcessEnd(i-m_tempSize, m_dwHeight-m_tempSize*2);
	pMainFrame->SetStatusBarText(0, "");
	
	//补数据...暂时不补
	/*
	for(i=0;i<m_tempSize;i++)
	{
		//上行
		for(j=0; j<m_dwWidth; j++)
		{
			m_pShowData[i * m_dwWidth + j] = m_pShowData[(m_tempSize + i) * m_dwWidth + j];
			
		}
		//下行
		for(j=0; j<m_dwWidth; j++)
		{
			m_pShowData[(m_dwHeight-m_tempSize+i) * m_dwWidth + j] 
						= m_pShowData[(m_dwHeight-m_tempSize*2+i) * m_dwWidth + j];
			
		}
	}
	for(i=0;i<m_dwHeight;i++)
	{
		//左列
		for(j=0; j<m_tempSize; j++)
		{
			m_pShowData[i * m_dwWidth + j] = m_pShowData[i * m_dwWidth + j + m_tempSize];
		}
		//右列
		for(j=0; j<m_tempSize; j++)
		{
			m_pShowData[i * m_dwWidth + (m_dwWidth-m_tempSize+j)] = 
						m_pShowData[i * m_dwWidth + (m_dwWidth-m_tempSize*2+j)];
		}
	}*/
	return;
}

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

	m_pData = m_pView->m_pImageData;
	ASSERT(m_pShowData != NULL);

	BeginWaitCursor();
	RadarImageLFilter4(m_nModel, pDoc->m_dwM4);
	EndWaitCursor();

	Invalidate();
}

void LFilterDlg::OnChangeFourLarge() 
{
	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;

	BeginWaitCursor();
	pDoc->LeeFilter4(dlg.GetPathName());
	EndWaitCursor();
}

⌨️ 快捷键说明

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