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

📄 rsipview.cpp

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

		CRSIPApp * theApp=(CRSIPApp *)AfxGetApp();
		CRSImage *pNewRsImage = new CRSImage();
						
		pNewRsImage->m_pImgData = pData;
		pNewRsImage->m_nImgHeight = height;
		pNewRsImage->m_nImgWidth = width;
		pNewRsImage->m_nImgType = IMAGE_COMBINE;

		theApp->CreateNewImageDoc(pNewRsImage,"未命名合成影象");
	}
}

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

	if( pDoc->m_pRSImage == NULL || 
		pDoc->m_pRSImage->m_pImgData == NULL )
		return;

	if( pDoc->m_pRSImage->m_nImgType == IMAGE_THEMATIC )
	{
		MessageBox("专题图像的直方图无意义!");
		return;
	}

	HistogramDlg HistoDlg(this);
	HistoDlg.m_dwPixels = pDoc->m_pRSImage->m_nImgHeight
		* pDoc->m_pRSImage->m_nImgWidth;
	HistoDlg.m_nImageType = pDoc->m_pRSImage->m_nImgType;
	//if(pDoc->m_pRSImage->m_pdwHistogram == NULL ||
		pDoc->m_bHistogramModified /*==*/= TRUE;
	//)
	//{
		pDoc->m_pRSImage->CalHistogram();
		pDoc->m_bHistogramModified = FALSE;
	//}
	HistoDlg.m_pdwHistogram = pDoc->m_pRSImage->m_pdwHistogram;
	HistoDlg.DoModal();
}

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

	if(pDoc->m_pRSImage!=NULL && 
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		CImgInfoSheet infoSheet("");

		infoSheet.SetTitle("影象信息");
		
		infoSheet.m_GeneralInfo.m_nImgWidth = pDoc->m_pRSImage->m_nImgWidth;
		infoSheet.m_GeneralInfo.m_nImgHeight = pDoc->m_pRSImage->m_nImgHeight;
		infoSheet.m_GeneralInfo.m_dHResolution = pDoc->m_pRSImage->m_dXResolution;
		infoSheet.m_GeneralInfo.m_dVResolution = pDoc->m_pRSImage->m_dYResolution;
		infoSheet.m_GeneralInfo.m_szImgName = pDoc->m_pRSImage->m_szImgName;
		infoSheet.m_GeneralInfo.m_dwDate = pDoc->m_pRSImage->m_dwDateOfImage;
		infoSheet.m_GeneralInfo.m_nImgType = pDoc->m_pRSImage->m_nImgType-1;
		infoSheet.m_GeneralInfo.m_MinWaveLength = pDoc->m_pRSImage->m_MinWaveLength;
		infoSheet.m_GeneralInfo.m_MaxWaveLength = pDoc->m_pRSImage->m_MaxWaveLength;

		for(int i=0; i<8; i++)
		{
			infoSheet.m_LocationInfo.m_pGeoPosi[i] = pDoc->m_pRSImage->m_pdGeoPosition[i];
		}

		CString * pszTemp;
		CString * pszTmp;
		for(i=0; i<infoSheet.m_LinkedImgPage.m_aLinkedImageArray.GetSize(); i++)
		{
			pszTemp = (CString *)infoSheet.m_LinkedImgPage.m_aLinkedImageArray.GetAt(i);
			delete pszTemp;
			infoSheet.m_LinkedImgPage.m_aLinkedImageArray.RemoveAt(i);
		}
		infoSheet.m_LinkedImgPage.m_nImageCount = pDoc->m_pRSImage->m_nLinkedImage;
		for(i=0; i<infoSheet.m_LinkedImgPage.m_nImageCount;i++)
		{
			pszTemp = (CString *)pDoc->m_pRSImage->m_aLinkedImageNameArray.GetAt(i);
			pszTmp = new CString();
			*pszTmp = *pszTemp;
			infoSheet.m_LinkedImgPage.m_aLinkedImageArray.Add(pszTmp);
		}
		infoSheet.m_LinkedImgPage.m_nImgHeight = pDoc->m_pRSImage->m_nImgHeight;
		infoSheet.m_LinkedImgPage.m_nImgWidth = pDoc->m_pRSImage->m_nImgWidth;

		if(infoSheet.DoModal()==IDOK)
		{
			pDoc->m_pRSImage->m_nImgWidth = infoSheet.m_GeneralInfo.m_nImgWidth;
			pDoc->m_pRSImage->m_nImgHeight = infoSheet.m_GeneralInfo.m_nImgHeight;
			pDoc->m_pRSImage->m_dXResolution = infoSheet.m_GeneralInfo.m_dHResolution;
			pDoc->m_pRSImage->m_dYResolution = infoSheet.m_GeneralInfo.m_dVResolution;
			pDoc->m_pRSImage->m_dwDateOfImage = infoSheet.m_GeneralInfo.m_dwDate;
			pDoc->m_pRSImage->m_szImgName = infoSheet.m_GeneralInfo.m_szImgName;
			pDoc->m_pRSImage->m_nImgType = infoSheet.m_GeneralInfo.m_nImgType+1;
			pDoc->m_pRSImage->m_MinWaveLength = infoSheet.m_GeneralInfo.m_MinWaveLength;
			pDoc->m_pRSImage->m_MaxWaveLength = infoSheet.m_GeneralInfo.m_MaxWaveLength;

			for(int i=0; i<8; i++)
			{
				pDoc->m_pRSImage->m_pdGeoPosition[i] = infoSheet.m_LocationInfo.m_pGeoPosi[i];
			}

			CString * pszTemp;
			CString * pszTmp;
			for(i=0; i<pDoc->m_pRSImage->m_aLinkedImageNameArray.GetSize(); i++)
			{
				pszTemp = (CString *)pDoc->m_pRSImage->m_aLinkedImageNameArray.GetAt(i);
				delete pszTemp;
				pDoc->m_pRSImage->m_aLinkedImageNameArray.RemoveAt(i);
			}
			pDoc->m_pRSImage->m_nLinkedImage = infoSheet.m_LinkedImgPage.m_nImageCount;
			for(i=0; i<pDoc->m_pRSImage->m_nLinkedImage; i++)
			{
				pszTemp = (CString *)infoSheet.m_LinkedImgPage.m_aLinkedImageArray.GetAt(i);
				pszTmp = new CString();
				*pszTmp = *pszTemp;
				pDoc->m_pRSImage->m_aLinkedImageNameArray.Add(pszTmp);
			}
		}
	}
}

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

	if(pDoc->m_pRSImage!=NULL && 
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		CResampleDlg resampleDlg;
		resampleDlg.m_nOriginHeight = pDoc->m_pRSImage->m_nImgHeight;
		resampleDlg.m_nOriginWidth = pDoc->m_pRSImage->m_nImgWidth;

		if(resampleDlg.DoModal() == IDOK)
		{
			int nResHeight = resampleDlg.m_nResultHeight;
			int nResWidth = resampleDlg.m_nResultWidth;
			int nMethod = resampleDlg.m_nMethod;
		
			pDoc->m_pRSImage->Resample(nResHeight,nResWidth,nMethod);
			pDoc->UpdateAllViews(NULL);
			pDoc->m_bModifiedFlag = TRUE;
			pDoc->m_bHistogramModified = TRUE;
		}
	}
}

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

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

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

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

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

	if(pDoc->m_pRSImage!=NULL && 
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		int nHeight = pDoc->m_pRSImage->m_nImgHeight;
		int nWidth = pDoc->m_pRSImage->m_nImgWidth;
		int nBmpCol = (pDoc->m_pRSImage->m_nImgWidth+3)/4*4;

		LPBYTE ppResult[3];
		for(int i=0; i<3; i++)
		{
			ppResult[i] = (BYTE *)new BYTE[nBmpCol*nHeight];
			if(NULL == ppResult[i])
			{
				for(int j=0; i<i; j++)
				{
					delete ppResult[j];
					ppResult[j] = NULL;
				}
				MessageBox("内存不足,无法完成操作!");
				return;
			}
		}
	
		BeginWaitCursor();

		int Process=0;
		int RPro;
	
		BYTE pIhs[3];

		if(pDoc->m_pRSImage->m_nImgType==IMAGE_COMBINE)
		{
			int nOriBmpCol = (pDoc->m_pRSImage->m_nImgWidth*3+3)/4*4;
			for(int i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
			{
				RPro=(int)(100.0 * (i+1)/ pDoc->m_pRSImage->m_nImgHeight);
				if(RPro>Process)
				{
					for(int j=0;j<RPro-Process;j++)
						UpdateStatusBar();
					Process=RPro;
				}
				for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
				{
					::GetIHS(pIhs,
						pDoc->m_pRSImage->m_pImgData[i*nOriBmpCol+j*3+2],
						pDoc->m_pRSImage->m_pImgData[i*nOriBmpCol+j*3+1],
						pDoc->m_pRSImage->m_pImgData[i*nOriBmpCol+j*3]);
					for(int k=0;k<3;k++)
					{
						ppResult[k][i*nBmpCol+j] = pIhs[k];
					}
				}
			}
		}
		else
		{
			BYTE cValue;
			for(int i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
			{
				RPro=(int)(100.0 * (i+1) / pDoc->m_pRSImage->m_nImgHeight);
				if(RPro>Process)
				{
					for(int j=0;j<RPro-Process;j++)
						UpdateStatusBar();
					Process=RPro;
				}
				for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
				{
					cValue = pDoc->m_pRSImage->m_pImgData[i*nBmpCol+j];
					::GetIHS(pIhs,
						GetRValue(pDoc->m_pRSImage->m_pPal[cValue]),
						GetGValue(pDoc->m_pRSImage->m_pPal[cValue]),
						GetBValue(pDoc->m_pRSImage->m_pPal[cValue]));
					for(int k=0; k<3; k++)
					{
						ppResult[k][i*nBmpCol+j] = pIhs[k];
					}
				}
			}
		}

		CRSIPApp *theApp = (CRSIPApp *)AfxGetApp();
		CString szDocName[3]={"亮度(I)","色调(H)","饱和度(S)"};

		for(i=0; i<3; i++)
		{
			CRSImage *pNewRSImage=new CRSImage();
			
			pNewRSImage->m_pImgData = ppResult[i];
			pNewRSImage->m_nImgHeight = pDoc->m_pRSImage->m_nImgHeight;
			pNewRSImage->m_nImgWidth = pDoc->m_pRSImage->m_nImgWidth;
			pNewRSImage->m_nImgType = IMAGE_SINGLEBAND;

			theApp->CreateNewImageDoc(pNewRSImage,szDocName[i]);
		}

		EndWaitCursor();
	}
}

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

	if(pDoc->m_pRSImage!=NULL && 
		pDoc->m_pRSImage->m_pImgData!=NULL)
	{
		int nHeight = pDoc->m_pRSImage->m_nImgHeight;
		int nWidth = pDoc->m_pRSImage->m_nImgWidth;
		int nBmpCol = (pDoc->m_pRSImage->m_nImgWidth+3)/4*4;

		LPBYTE ppResult[3];
		for(int i=0; i<3; i++)
		{
			ppResult[i] = (BYTE *)new BYTE[nBmpCol*nHeight];
			if(NULL == ppResult[i])
			{
				for(int j=0; i<i; j++)
				{
					delete ppResult[j];
					ppResult[j] = NULL;
				}
				MessageBox("内存不足,无法完成操作!");
				return;
			}
		}
	
		BeginWaitCursor();

		int Process=0;
		int RPro;

		if(pDoc->m_pRSImage->m_nImgType == IMAGE_COMBINE)
		{
			int nOriBmpCol = (pDoc->m_pRSImage->m_nImgWidth*3+3)/4*4;
			for(int i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
			{
				RPro=(int)(100.0 * (i+1) / pDoc->m_pRSImage->m_nImgHeight);
				if(RPro>Process)
				{
					for(int j=0; j<RPro-Process; j++)
						UpdateStatusBar();
					Process=RPro;
				}
				for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
				{
					for(int k=0; k<3; k++)
					{
						ppResult[k][i*nBmpCol+j] = 
							pDoc->m_pRSImage->m_pImgData[i*nOriBmpCol+j*3+k];
					}
				}
			}
		}
		else
		{
			BYTE cValue;
			for(int i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
			{
				RPro=(int)(100.0 * (i+1) / pDoc->m_pRSImage->m_nImgHeight);
				if(RPro>Process)
				{
					for(int j=0; j<RPro-Process; j++)
						UpdateStatusBar();
					Process=RPro;
				}
				for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
				{
					cValue = pDoc->m_pRSImage->m_pImgData[i*nBmpCol+j];
					ppResult[0][i*nBmpCol+j] = GetRValue(pDoc->m_pRSImage->m_pPal[cValue]);
					ppResult[1][i*nBmpCol+j] = GetGValue(pDoc->m_pRSImage->m_pPal[cValue]);
					ppResult[2][i*nBmpCol+j] = GetBValue(pDoc->m_pRSImage->m_pPal[cValue]);
				}
			}
		}

		CRSIPApp *theApp = (CRSIPApp *)AfxGetApp();
		CString szDocName[3] = {"红(R)","绿(G)","蓝(B)"};

		for(i=0; i<3; i++)
		{
			CRSImage *pNewRSImage = new CRSImage();
			
			pNewRSImage->m_pImgData = ppResult[i];
			pNewRSImage->m_nImgHeight = pDoc->m_pRSImage->m_nImgHeight;
			pNewRSImage->m_nImgWidth = pDoc->m_pRSImage->m_nImgWidth;
			pNewRSImage->m_nImgType = IMAGE_SINGLEBAND;

			theApp->CreateNewImageDoc(pNewRSImage,szDocName[i]);
		}

		EndWaitCursor();
	}
}

void CRSIPView::OnImageCalculate() 
{
	CCalcultateImgDlg CalculateDialog(this);
	if(CalculateDialog.DoModal() == IDOK)
	{
		int nImgType = CalculateDialog.m_nImageType;
		int Height = CalculateDialog.m_imgHeight;
		int Width = CalculateDialog.m_imgWidth;
		struct Token *pTheToken = new struct Token[CalculateDialog.m_nTokenCount+1];
		for(int i=0; i<CalculateDialog.m_nTokenCount; i++)
			pTheToken[i] = CalculateDialog.m_TheToken[i];
		int OptrNum = CalculateDialog.m_nOptrCount+2;
		int OpndNum = CalculateDialog.m_nOpndCount;
		
		// 增加一个符号
		pTheToken[CalculateDialog.m_nTokenCount].Type=DELIMITER;
		pTheToken[CalculateDialog.m_nTokenCount].Flag=6;
		strcpy(pTheToken[CalculateDialog.m_nTokenCount].Cont,"#\0");

		// 操作符与操作数
		struct OPTR *Optr =	new struct OPTR [OptrNum+2];
		struct OPND *Opnd = new struct OPND [OpndNum];

		// 当前操作符与操作数
		struct OPTR CurOptr;
		struct OPND Opnd1,Opnd2;
		
		// 开始计算
		int CurCal = 0;
		int OptrStkNum = 0;
		int OpndStkNum = 0;
		Optr[OptrStkNum].Type = DELIMITER;
		Optr[OptrStkNum].Flag = 6;// #
		OptrStkNum++;
		HANDLE Filehp1;
		HANDLE Filehp2;
		HANDLE Resfh;
		CFile File;
		int High;
		
		BeginWaitCursor();

		for(;;)
		{
			if(CurCal == CalculateDialog.m_nTokenCount+1)
				break;
			if(Optr[OptrStkNum-1].Type==DELIMITER && Optr[OptrStkNum-1].Flag==6 &&
				pTheToken[CurCal].Type==DELIMITER && pTheToken[CurCal].Flag==6)
				break;
			if(pTheToken[CurCal].Type==NUMBER || pTheToken[CurCal].Type==ISFILENAME)
			{
				//Push Opnd Stack
				Opnd[OpndStkNum].Type=pTheToken[CurCal].Type;
				if(pTheToken[CurCal].Type == NUMBER)
					Opnd[OpndStkNum].Number = pTheToken[CurCal].Number;
				else
					strcpy(Opnd[OpndStkNum].FileName,pTheToken[CurCal].Cont);
				CurCal++;
				OpndStkNum++;
				continue;
			}
			else
			{
				CurOptr.Type = pTheToken[CurCal].Type;
				CurOptr.Flag = pTheToken[CurCal].Flag;
				High = Higher(Optr[OptrStkNum-1],CurOptr);
				if(High==-1)		//Push Stack
				{
					Optr[OptrStkNum].Type=CurOptr.Type;
					Optr[OptrStkNum].Flag=CurOptr.Flag;
					OptrStkNum++;
					CurCal++;	
					continue;
				}
				else if(High==0)	//Pop stack and discard it	
				{
					if(CurOptr.Type==DELIMITER && CurOptr.Flag==1)
						OptrStkNum--;
					CurCal++;
					continue;
				}
				else if(High==1)
				{
					//Pop Optr Stack

⌨️ 快捷键说明

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