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

📄 rsipview.cpp

📁 基于小波的SAR斑点处理
💻 CPP
📖 第 1 页 / 共 5 页
字号:

		float *lpenerg=(float *)malloc(Size*Size*sizeof(float));

		float Max = -MAXFLOAT;
		float Min = MAXFLOAT;
		int Process=0;
		int RPro;
		DWORD Order;
		for(i=0; i<Size; i++)
		{
			RPro=(int)(100.0 * (i+1) / Size);
			if(RPro>Process)
			{
				for(int j=0; j<RPro-Process; j++)
					UpdateStatusBar();
				Process=RPro;
			}
			for (int j=0; j<Size; j++)
			{
				Order = i*Size+j;
				lpenerg[Order]=lpreal[Order]*lpreal[Order]+
					lpimag[Order]*lpimag[Order];
				lpenerg[Order]=(float)log(sqrt(lpenerg[Order])+1);
				if(lpenerg[(DWORD)i*Size+j]>Max)
					Max=lpenerg[(DWORD)i*Size+j];
				if(lpenerg[(DWORD)i*Size+j]<Min)
					Min=lpenerg[(DWORD)i*Size+j];
			}
		}
		free(lpimag);
		free(lpreal);
	
		BYTE *pNewData = (BYTE *)malloc(Size*Size);

		// 对频域信息作线性拉伸5倍(即为255*5)
		float Ratio = 1275/(Max-Min);
		for ( i=0; i<Size; i++)
			for (int j=0;j<Size; j++)
			{
				Temp=(lpenerg[(DWORD)i*Size+j]-Min)*Ratio;
				if(Temp<0)
					pNewData[(DWORD)i*Size+j]=0;
				else if(Temp>255)
					pNewData[(DWORD)i*Size+j]=255;
				else
					pNewData[(DWORD)i*Size+j]=(BYTE)Temp;
			}	
  	
		free(lpenerg);
		EndWaitCursor();
	
		CRSImage * pNewRSImage = new CRSImage();
				
		pNewRSImage->m_pImgData = pNewData;
		pNewRSImage->m_nImgHeight = Size;
		pNewRSImage->m_nImgWidth = Size;
		pNewRSImage->m_nImgType = IMAGE_SINGLEBAND;
	
		CRSIPApp *theApp = (CRSIPApp *)AfxGetApp();
		theApp->CreateNewImageDoc(pNewRSImage,"功率谱(频域信息)");
	}	
}

void CRSIPView::OnImageRevert() 
{
	CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
	ASSERT(pDoc != NULL);

	if(pDoc->m_pRSImage!=NULL &&  
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		pDoc->m_pRSImage->Revert();
		pDoc->UpdateAllViews(NULL);
		pDoc->m_bModifiedFlag = TRUE;
		pDoc->m_bHistogramModified = TRUE;
	}
}

void CRSIPView::OnImageEquualize() 
{
	CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
	ASSERT(pDoc != NULL);

	if(pDoc->m_pRSImage!=NULL &&  
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		pDoc->m_pRSImage->Equalize();
		pDoc->UpdateAllViews(NULL);
		pDoc->m_bModifiedFlag = TRUE;
		pDoc->m_bHistogramModified = TRUE;
	}
}

void CRSIPView::OnImageThreshold() 
{
	CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
	ASSERT(pDoc != NULL);

	if(pDoc->m_pRSImage!=NULL &&  
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		CThresholdDlg thresholdDlg(this);
		if(pDoc->m_pRSImage->m_pdwHistogram==NULL ||
			pDoc->m_bHistogramModified == TRUE)
		{
			pDoc->m_pRSImage->CalHistogram();
			pDoc->m_bHistogramModified = FALSE;
		}
		thresholdDlg.m_pdwHistogram = pDoc->m_pRSImage->m_pdwHistogram;
		if(thresholdDlg.DoModal() == IDOK)
		{
			pDoc->m_pRSImage->Threshold(thresholdDlg.m_nThresholdLevel);
			pDoc->UpdateAllViews(NULL);
			pDoc->m_bModifiedFlag = TRUE;
			pDoc->m_bHistogramModified = TRUE;
		}
	}
}

void CRSIPView::OnImagePosterize() 
{
	CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
	ASSERT(pDoc != NULL);

	if(pDoc->m_pRSImage!=NULL &&  
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		CPosterizeDlg posterizeDlg(this);
		if(pDoc->m_pRSImage->m_pdwHistogram==NULL ||
			pDoc->m_bHistogramModified == TRUE)
		{
			pDoc->m_pRSImage->CalHistogram();
			pDoc->m_bHistogramModified = FALSE;
		}
		posterizeDlg.m_pdwHistogram = pDoc->m_pRSImage->m_pdwHistogram;
		
		if(posterizeDlg.DoModal() == IDOK)
		{
			int nNum = posterizeDlg.m_nNum;
			BYTE temp[256];
			for(int i=0; i<nNum+1; i++)
			{
				temp[i] = posterizeDlg.m_lpPoint[i];
			}

			pDoc->m_pRSImage->Posterize(temp,nNum);
			pDoc->UpdateAllViews(NULL);
			pDoc->m_bModifiedFlag = TRUE;
			pDoc->m_bHistogramModified = TRUE;
		}
	}
}

void CRSIPView::OnFilterFilter() 
{
	CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
	ASSERT(pDoc != NULL);

	if(pDoc->m_pRSImage!=NULL &&  
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		CFilterDlg filterDlg(this);
		if(filterDlg.DoModal() == IDOK)
		{
			int filterType = filterDlg.m_nFilterType;
			int filterWndSize = (filterDlg.m_nFilterWndSize+1)*2+1;
			pDoc->m_pRSImage->Filter(filterWndSize,filterType);
			pDoc->UpdateAllViews(NULL);
			pDoc->m_bModifiedFlag = TRUE;
			pDoc->m_bHistogramModified = TRUE;
		}
	}	
}

void CRSIPView::OnFilterPower() 
{
	CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
	ASSERT(pDoc != NULL);

	if(pDoc->m_pRSImage!=NULL &&  
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		if(pDoc->m_pRSImage->m_nImgType != IMAGE_SINGLEBAND)
		{
			AfxMessageBox("该功能只适于单波段图象!");
			return;
		}
		int Size=pDoc->m_pRSImage->m_nImgWidth>pDoc->m_pRSImage->m_nImgHeight?
		pDoc->m_pRSImage->m_nImgWidth:pDoc->m_pRSImage->m_nImgHeight;

		if(Size>1024)
		{
			MessageBox("做二维傅立叶变换,图象过大!");
			return;
		}

		int Time=powerof2(2,Size);
		//int Time=int(log(Size)/log(2))+1;
		Size=1;
		for(int i=0;i<Time;i++)
			Size*=2;

		BYTE *pbMap = (BYTE *)malloc(Size*Size);
		if(pbMap == NULL)
		{
			MessageBox("做二维傅立叶变换,内存不足!");
			return;
		}

		int BmpCol = (pDoc->m_pRSImage->m_nImgWidth+3)/4*4;
		for(i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
			for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
				pbMap[(DWORD)i*Size+j] =
					pDoc->m_pRSImage->m_pImgData[(DWORD)(pDoc->m_pRSImage->m_nImgHeight-i-1)*BmpCol+j];


		float *lpreal = NULL;
		float *lpimag = NULL;
		lpreal = (float *)malloc(sizeof(float)*Size*Size);
		lpimag = (float *)malloc(sizeof(float)*Size*Size);

		if(lpimag==NULL || lpreal==NULL)
		{
			if(lpimag!=NULL)
				free(lpimag);
			if(lpreal!=NULL)
				free(lpreal);
			free(pbMap);
			MessageBox("做二维傅立叶变换,内存不足!");
			return;
		}

		BeginWaitCursor();

		float Temp;

		for ( i=0; i<Size; i++)
			for (int j=0;j<Size; j++)
			{
				Temp= (float)pbMap[(DWORD)i*Size+j];
				if ( (i+j) %2 != 0 )
					lpreal[(DWORD)i*Size+j] =  -Temp;
				else
					lpreal[(DWORD)i*Size+j] = Temp;
				lpimag[(DWORD)i*Size+j] = 0.0;
			}
		free(pbMap);

		FFT2D( lpreal, lpimag, Size, 0 ,Time);

		EndWaitCursor();

		CFrequencyFilterDlg FrequencyFilterDialog(this);
		FrequencyFilterDialog.m_nSize = Size;
		if(FrequencyFilterDialog.DoModal() == IDOK)
		{
			int FilterType = FrequencyFilterDialog.m_nFilterType;
			int FilterFunc = FrequencyFilterDialog.m_nFilterFunction;
			int Radias1 = FrequencyFilterDialog.m_nRadias1;
			int Radias2 = FrequencyFilterDialog.m_nRadias2;

			BeginWaitCursor();

			float Center = (float)(Size-1)/2;
			int Process=0;
			int RPro;
			DWORD Order;
			for(i=0; i<Size; i++)
			{
				RPro=(int)(100.0 * (i+1) / Size);
				if(RPro>Process)
				{
					for(int j=0; j<RPro-Process; j++)
						UpdateStatusBar();
					Process=RPro;
				}
				for(int j=0; j<Size; j++)
				{
					Order = (DWORD)i*Size+j;
					if(FilterFunc == 0)//Rect
					{
						if(FilterType == 0)//High Pass
						{
							if(fabs(i-Center)<Radias1 && fabs(j-Center)<Radias1)
							{
								lpimag[Order] = 0.0;
								lpreal[Order] = 0.0;
							}
						}
						else if(FilterType == 1)//Low Pass
						{
							if(fabs(i-Center)>=Radias1 || fabs(j-Center)>=Radias1)
							{
								lpimag[Order] = 0.0;
								lpreal[Order] = 0.0;
							}
						}
						else if(FilterType == 2)//Band
						{
							if(fabs(i-Center)>=Radias2 || fabs(j-Center)>=Radias2 ||
								fabs(i-Center)<Radias1 || fabs(j-Center)<Radias1)
							{
								lpimag[Order] = 0.0;
								lpreal[Order] = 0.0;
							}
						}
					}
					else if(FilterFunc == 1)//Circle
					{
						float Dis = (float)sqrt((i-Center)*(i-Center)+(j-Center)*(j-Center));
						if(FilterType == 0)
						{
							if(Dis < Radias1)
							{
								lpimag[Order] = 0.0;
								lpreal[Order] = 0.0;
							}
						}
						else if(FilterType == 1)
						{
							if(Dis >= Radias1)
							{
								lpimag[Order] = 0.0;
								lpreal[Order] = 0.0;
							}
						}
						else if(FilterType == 2)
						{
							if(Dis>=Radias2 || Dis<Radias1)
							{
								lpimag[Order] = 0.0;
								lpreal[Order] = 0.0;
							}
						}
					}
					else if(FilterFunc==2)	//Butterworth
					{
						float Dis = (float)sqrt((i-Center)*(i-Center)+(j-Center)*(j-Center));
						float Ratio;
						if(FilterType==0)
							Ratio = float(1/(1+0.414*((float)Radias1*Radias1/Dis/Dis)));
						else
							Ratio = float(1/(1+0.414*(Dis*Dis/Radias1/Radias1)));
						lpimag[Order] *= Ratio;
						lpreal[Order] *= Ratio;
					}
					else		//Exponential
					{
						float Dis = (float)sqrt((i-Center)*(i-Center)+(j-Center)*(j-Center));
						float Ratio;
						if(FilterType==0)
							Ratio = (float)exp(-0.347*(Radias1*Radias1/Dis/Dis));
						else
							Ratio = (float)exp(-0.347*(Dis*Dis/Radias1/Radias1));
						lpimag[Order] *= Ratio;
						lpreal[Order] *= Ratio;
					}
				}
			}		//Filter end

			//Now begin do the inversed FFT,the third parameeter "1" mean inversed FFT
			FFT2D( lpreal, lpimag, Size, 1 ,Time);

			free(lpimag);

			//Now create new document
			for (i=0; i<Size; i++)
				for (int j=0; j<Size; j++)
				{
					Temp= (float)lpreal[(DWORD)i*Size+j];
					if ( (i+j) %2 != 0 )
						lpreal[(DWORD)i*Size+j] =  -Temp;
					else
						lpreal[(DWORD)i*Size+j] = Temp;
				}


			BYTE *pNewData = (BYTE *)malloc(BmpCol * pDoc->m_pRSImage->m_nImgHeight);
	
			for(i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
				for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
				{
					if(lpreal[i*Size+j]>255)
						pNewData[(pDoc->m_pRSImage->m_nImgHeight-i-1)*BmpCol+j]=255;
					if(lpreal[(DWORD)i*Size+j]<0)
						pNewData[(pDoc->m_pRSImage->m_nImgHeight-i-1)*BmpCol+j]=0;
					else
						pNewData[(pDoc->m_pRSImage->m_nImgHeight-i-1)*BmpCol+j]=(BYTE)lpreal[(DWORD)i*Size+j];
				}

			free(lpreal);
	
			EndWaitCursor();

			CRSImage *pNewRSImage = new CRSImage();
			//pNewRsMap->CopyInfoFrom(pDoc->m_pRsMap);
		
			pNewRSImage->m_pImgData = pNewData;
			pNewRSImage->m_nImgHeight = pDoc->m_pRSImage->m_nImgHeight;
			pNewRSImage->m_nImgWidth = pDoc->m_pRSImage->m_nImgWidth;
			pNewRSImage->m_nImgType = pDoc->m_pRSImage->m_nImgType;

			CRSIPApp *theApp = (CRSIPApp *)AfxGetApp();
			theApp->CreateNewImageDoc(pNewRSImage,"滤波影象");
		}
	}
}

void CRSIPView::OnFilterEdege() 
{
	CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
	ASSERT(pDoc != NULL);

	if(pDoc->m_pRSImage!=NULL &&  
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		pDoc->m_pRSImage->FindEdge();
		pDoc->UpdateAllViews(NULL);
		pDoc->m_bModifiedFlag = TRUE;
		pDoc->m_bHistogramModified = TRUE;
	}
}

void CRSIPView::OnFilterSharpen()
{
	CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
	ASSERT(pDoc != NULL);

	if(pDoc->m_pRSImage!=NULL &&  
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		pDoc->m_pRSImage->Sharpen();
		pDoc->UpdateAllViews(NULL);
		pDoc->m_bModifiedFlag = TRUE;
		pDoc->m_bHistogramModified = TRUE;
	}
}

void CRSIPView::OnFilterAuto() 
{
	CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
	ASSERT(pDoc != NULL);

	if(pDoc->m_pRSImage!=NULL &&  
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		CUserDefFilterDlg UserDefFilterDlg(this);
		if(UserDefFilterDlg.DoModal() == IDOK)
		{
			pDoc->m_pRSImage->UserFilter(
				UserDefFilterDlg.m_nUnitValue,
				UserDefFilterDlg.m_nFactor,
				UserDefFilterDlg.m_nBias,
				UserDefFilterDlg.m_bRevert);
			pDoc->UpdateAllViews(NULL);
			pDoc->m_bModifiedFlag = TRUE;
			pDoc->m_bHistogramModified = TRUE;
		}
	}
}

void CRSIPView::OnClassCharacter() 
{
	CSelfClusterDlg characterWinClsDlg(this);
	characterWinClsDlg.m_static = "窗口等级(%)";
	characterWinClsDlg.m_nClusterTime = 20;
	if(characterWinClsDlg.DoModal()==IDOK)
	{
		int Height = characterWinClsDlg.m_nImgHeight;
		int Width = characterWinClsDlg.m_nImgWidth;

⌨️ 快捷键说明

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