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

📄 rsimage.cpp

📁 基于小波的SAR斑点处理
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include "StdAfx.h"
#include "RSImage.h"
#include "Progress.h"
#include "Comput.h"

#include <math.h>

//#define ADDBYTE			14
//#define MAXCOLOR		256
#define PI				3.1415926

// 构造函数
CRSImage::CRSImage()
{
	m_pPal = NULL;

	//m_bPreview = FALSE;
	//m_pNewPal = NULL;

	m_nImgHeight = 0;
	m_nImgWidth = 0;


	m_pdwHistogram = NULL;
	m_MinWaveLength = 0;
	m_MaxWaveLength = 0;

	m_szImgName.Empty();

	m_pImgData = NULL;
	m_pUndoData = NULL;

	m_nImgType = IMAGE_NOTHING;

	m_nLinkedImage = 0;
	m_nClassNumber = 0;

	m_dXResolution = 1.0;
	m_dYResolution = 1.0;

	m_dwDateOfImage = 0;

	// the geo-position of image
	// An arbitary impossible value
	for(int i=0;i<8;i++)
		m_pdGeoPosition[i] = 10000;
}

// 析构函数
CRSImage::~CRSImage()
{
	// 释放空间
	if(m_pPal != NULL)				//调色板
		delete []m_pPal;
	//if(m_pNewPal != NULL)			//预览时的调色板
		//delete []m_pNewPal;
	if(m_pdwHistogram != NULL)		//直方图
		delete []m_pdwHistogram;
	if(m_pImgData != NULL)			//数据块
		free(m_pImgData);
	if(m_pUndoData != NULL)
		delete []m_pUndoData;

	// 释放关联图象数组所占的空间
	for(int i=0;i<m_nLinkedImage;i++)
	{
		CString *pszTemp = (CString *)(m_aLinkedImageNameArray[i]);
		delete pszTemp;
	}
	m_aLinkedImageNameArray.RemoveAll();

	// 释放专题类别信息数组所占的空间
	for(i=0; i<m_nClassNumber; i++)
	{
		CRsThematicInfo * pRsThematicInfo = m_aThemeInfoArray.GetAt(i);
		delete pRsThematicInfo;
	}
	m_aThemeInfoArray.RemoveAll();
}

/*
// 信息拷贝
void CRSImage::CopyInfoFrom(CRSImage * pRSImage)
{
	m_szImgName = pRSImage->m_szImgName;
	
	m_dXResolution = pRSImage->m_dXResolution;
	m_dYResolution = pRSImage->m_dYResolution;
	
	for(int m=0; m<8; m++)
		m_pdGeoPosition[m] = pRSImage->m_pdGeoPosition[m];
	
	m_dwDateOfImage = pRSImage->m_dwDateOfImage;

	m_MinWaveLength = pRSImage->m_MinWaveLength;
	m_MaxWaveLength = pRSImage->m_MaxWaveLength;

	if(m_pPal == NULL)
	{
		m_pPal = new COLORREF[pRSImage->m_nClassNumber];
		for(int i=0; i<pRSImage->m_nClassNumber; i++)
			m_pPal[i]=pRSImage->m_pPal[i];
	}
	
	// Histogram,the size is 256*3 for a RGB true color
	// image,or the size is 256.
	//DWORD * m_pdwHistogram;

	m_nLinkedImage = pRSImage->m_nLinkedImage;
	m_aLinkedImageNameArray.RemoveAll();
	for(int i=0; i<m_nLinkedImage; i++)
	{
		CString * pszTemp = NULL;
		CString * pszTemp1 = (CString *)new CString();
		
		pszTemp = (CString *)pRSImage->m_aLinkedImageNameArray.GetAt(i);
		*pszTemp1 = *pszTemp;
		m_aLinkedImageNameArray.Add(pszTemp1);
	}

	m_nClassNumber = pRSImage->m_nClassNumber;
	m_aThemeInfoArray.RemoveAll();
	for(i=0; i<m_nClassNumber; i++)
	{
		CRsThematicInfo * pRsThematicInfo = pRSImage->m_aThemeInfoArray.GetAt(i);
		CRsThematicInfo * pRsThematicInfo1 = new CRsThematicInfo();

		pRsThematicInfo1->m_clrColor = pRsThematicInfo->m_clrColor;
		pRsThematicInfo1->m_nValue = pRsThematicInfo->m_nValue;
		pRsThematicInfo1->m_szClassName = pRsThematicInfo->m_szClassName;

		if(pRsThematicInfo->m_pdCenter != NULL)
		{
			pRsThematicInfo1->m_pdCenter = (double *)new double[m_nLinkedImage];
			for(int j=0; j<m_nLinkedImage; j++)
			{
				pRsThematicInfo1->m_pdCenter[j] = pRsThematicInfo->m_pdCenter[j];
			}
		}

		if(pRsThematicInfo->m_pdCovariance != NULL)
		{
			pRsThematicInfo1->m_pdCovariance = (double *)new double[m_nLinkedImage*m_nLinkedImage];
			for(int j=0; j<m_nLinkedImage*m_nLinkedImage; j++)
			{
				pRsThematicInfo1->m_pdCovariance[j] = pRsThematicInfo->m_pdCovariance[j];
			}
		}

		m_aThemeInfoArray.Add(pRsThematicInfo1);
	}
}
*/

void CRSImage::CopyThematicInfo(CRSImage * pRSImage)
{
	// 清空
	for(int i=0; i<m_nClassNumber; i++)
	{
		CRsThematicInfo * pRsThematicInfo = m_aThemeInfoArray.GetAt(i);
		delete pRsThematicInfo;
	}
	m_aThemeInfoArray.RemoveAll();

	// 复制
	m_nClassNumber = pRSImage->m_nClassNumber;
	for(i=0; i<m_nClassNumber; i++)
	{
		CRsThematicInfo * pRsThematicInfo = pRSImage->m_aThemeInfoArray.GetAt(i);
		CRsThematicInfo * pRsThematicInfo1 = new CRsThematicInfo();

		pRsThematicInfo1->m_clrColor = pRsThematicInfo->m_clrColor;
		pRsThematicInfo1->m_nValue = pRsThematicInfo->m_nValue;
		pRsThematicInfo1->m_szClassName = pRsThematicInfo->m_szClassName;

		if(pRsThematicInfo->m_pdCenter != NULL &&
			pRSImage->m_nLinkedImage != 0)
		{
			pRsThematicInfo1->m_pdCenter = (double *)new double[m_nLinkedImage];
			for(int j=0; j<m_nLinkedImage; j++)
			{
				pRsThematicInfo1->m_pdCenter[j] = pRsThematicInfo->m_pdCenter[j];
			}
		}

		if(pRsThematicInfo->m_pdCovariance != NULL &&
			pRSImage->m_nLinkedImage != 0)
		{
			pRsThematicInfo1->m_pdCovariance = (double *)new double[m_nLinkedImage*m_nLinkedImage];
			for(int j=0; j<m_nLinkedImage*m_nLinkedImage; j++)
			{
				pRsThematicInfo1->m_pdCovariance[j] = pRsThematicInfo->m_pdCovariance[j];
			}
		}

		m_aThemeInfoArray.Add(pRsThematicInfo1);
	}
}

// 从文件中装载全部影象数据块
BOOL CRSImage::LoadWholeImage(CFile * file,int srcHeight,int srcWidth)
{
	int nBmpColNum;
	int nLineWidth;
	int Process=0;
	int RPro;

	int i,j;

	m_nImgHeight = srcHeight;
	m_nImgWidth = srcWidth;

	if(m_nImgType != IMAGE_COMBINE)
	{
		nBmpColNum = (m_nImgWidth+3)/4*4;
		nLineWidth = srcWidth;
	}
	else
	{
		nBmpColNum = (m_nImgWidth*3+3)/4*4;
		nLineWidth = srcWidth*3;
	}
	
	m_pImgData = new BYTE[nBmpColNum*m_nImgHeight];
	if(m_pImgData == NULL)
	{
		AfxMessageBox("申请内存空间失败!");
		return FALSE;
	}

	for(i = 0; i < m_nImgHeight; i++)
	{
		RPro = (int)(100.0 * (i+1) / m_nImgHeight);
		if(RPro > Process)
		{
			for(j=0; j < RPro-Process; j++)
				UpdateStatusBar();
			Process = RPro;
		}
		file->Read(m_pImgData+(m_nImgHeight-i-1)*nBmpColNum,nLineWidth);
	}
	return TRUE;
}

// 从文件中装载遥感影象
BOOL CRSImage::LoadRsImage(CFile *file, int srcHeight, int srcWidth,
							int nBeginX, int nBeginY,
							int Height, int Width, int nResRatio)
{
	int nBmpColNum;
	int nLineWidth;
	BYTE *  pbLine;

	if(nBeginX==0 && nBeginY==0 && Height==0 || 
		 Width==0 && nResRatio==1)
		return LoadWholeImage(file,srcHeight,srcWidth);

	if(Height==0)
		Height = srcHeight;
	if(Width==0)
		Width = srcWidth;
	
	ASSERT(nBeginX+Width <= srcWidth && nBeginY+Height <= srcHeight);

	m_nImgHeight = Height/nResRatio;
	m_nImgWidth = Width/nResRatio;

	if(m_nImgType != IMAGE_COMBINE)
	{
		nBmpColNum = (m_nImgWidth+3)/4*4;
		nLineWidth = srcWidth;
		pbLine = new BYTE[srcWidth];
		ASSERT(pbLine != NULL);
	}
	else
	{
		nBmpColNum = (m_nImgWidth*3+3)/4*4;
		nLineWidth = srcWidth*3;
		pbLine = new BYTE[srcWidth*3];
		ASSERT(pbLine != NULL);
	}
	
	m_pImgData = new BYTE[nBmpColNum*m_nImgHeight];
	if(m_pImgData == NULL)
	{
		AfxMessageBox("申请内存失败!");
		return FALSE;
	}

	int Process=0;
	int RPro;
	int i,j;

	for(i=0; i < m_nImgHeight; i++)
	{
		RPro=(int)(100.0 * (i+1) / m_nImgHeight);
		if(RPro>Process)
		{
			for(j=0; j < RPro-Process; j++)
				UpdateStatusBar();
			Process=RPro;
		}
		file->Seek(nLineWidth*(i*nResRatio+nBeginY),CFile::begin);
		file->Read(pbLine,nLineWidth);

		if(m_nImgType != IMAGE_COMBINE)
		{
			for(j=0; j<m_nImgWidth; j++)
			{
				m_pImgData[(m_nImgHeight-i-1)*nBmpColNum+j] = 
					pbLine[j*nResRatio+nBeginX];
			}
		}
		else
		{
			for(j=0; j<m_nImgWidth; j++)
			{
				m_pImgData[(m_nImgHeight-i-1)*nBmpColNum+j*3] = 
					pbLine[(j*nResRatio+nBeginX)*3];
				m_pImgData[(m_nImgHeight-i-1)*nBmpColNum+j*3+1] = 
					pbLine[(j*nResRatio+nBeginX)*3+1];
				m_pImgData[(m_nImgHeight-i-1)*nBmpColNum+j*3+2] = 
					pbLine[(j*nResRatio+nBeginX)*3+2];
			}
		}
	}
	delete pbLine;
	pbLine = NULL;

 	return TRUE;
}

// 保存遥感影象(要求文件以可写方式打开,操作后不关闭)
BOOL CRSImage::SaveRsImage(CFile *file)
{
	int nBmpColNum;
	int nTheWidth;

	// 计算图象宽度
	if(m_nImgType == IMAGE_COMBINE)
	{
		nBmpColNum = (m_nImgWidth*3+3)/4*4;
		nTheWidth = m_nImgWidth*3;
	}
	else
	{
		nBmpColNum = (m_nImgWidth+3)/4*4;
		nTheWidth = m_nImgWidth;
	}

	// 写数据块
	TRY
	{
		for(int i=m_nImgHeight-1;i>=0;i--)
		{
			file->Write((m_pImgData+i*nBmpColNum),nTheWidth);
		}
	}
	CATCH( CFileException, e )		//Some error
	{
		AfxMessageBox("写文件时出错!");
		return FALSE;
	}
	END_CATCH

	return TRUE;
}

// 获取遥感影象信息(要求文件以可读方式打开,操作后不关闭)
BOOL CRSImage::LoadRsInfo(CFile * infFile)
{
	TRY
	{
		DWORD dwFlag;									//文件标志
		infFile->Read(&dwFlag,sizeof(DWORD));
		if(dwFlag != HEADERFLAG)
			return FALSE;
		infFile->Read(&m_nImgType,sizeof(int));			//文件类型
		char szName[256];								//文件名字
		infFile->Read(szName,256);
		m_szImgName = szName;
		infFile->Read(&m_dwDateOfImage,sizeof(DWORD));	//成象日期
		infFile->Read(&m_MinWaveLength,sizeof(BYTE));	//成象波长
		infFile->Read(&m_MaxWaveLength,sizeof(BYTE));

		infFile->Read(&m_nImgWidth,sizeof(int));		//宽
		infFile->Read(&m_nImgHeight,sizeof(int));		//高
		infFile->Read(&m_dXResolution,sizeof(double));	//水平分辨率
		infFile->Read(&m_dYResolution,sizeof(double));	//垂直分辨率
		
		for(int i=0; i<8; i++)							//地理分布范围
		{
			infFile->Read(m_pdGeoPosition+i,sizeof(double));
		}

		infFile->Seek(10*sizeof(DWORD),CFile::current);	//保留字节40
		
		if(m_nImgType == IMAGE_COMBINE)					//直方图信息
		{
			if(m_pdwHistogram == NULL)
			{
				m_pdwHistogram = new DWORD[3*256];
				ASSERT(m_pdwHistogram != NULL);
			}
			infFile->Read(m_pdwHistogram,sizeof(DWORD)*3*256);
		}
		else
		{
			if(m_pdwHistogram == NULL)
			{
				m_pdwHistogram = new DWORD[256];
				ASSERT(m_pdwHistogram != NULL);
			}
			infFile->Read(m_pdwHistogram,sizeof(DWORD)*256);
		}
	}

	CATCH( CFileException, e )		//Some error
	{
		AfxMessageBox("读文件出错!");
		return FALSE;
	}
	END_CATCH
	
	infFile->Read(&m_nLinkedImage,sizeof(int));			//连接的图象
	ASSERT(m_nLinkedImage>=0);

	CString * pszTemp;
	char szText[256];
	int i;
	for(i=0; i<m_nLinkedImage; i++)
	{
		pszTemp = new CString();
		infFile->Read(szText,256);
		*pszTemp = szText;
		m_aLinkedImageNameArray.Add(pszTemp);
	}

	if(m_nImgType == IMAGE_THEMATIC)					//类别信息
	{
		infFile->Read(&m_nClassNumber,sizeof(int));
		CRsThematicInfo *pInfo;
		for(i=0; i<m_nClassNumber; i++)
		{
			pInfo = new CRsThematicInfo();
			TRY
			{
				infFile->Read(&(pInfo->m_nValue),sizeof(int));
				infFile->Read(szText,256);
				pInfo->m_szClassName = szText;

				infFile->Read(&(pInfo->m_clrColor),sizeof(COLORREF));
				pInfo->m_pdCenter = new double[m_nLinkedImage];
				infFile->Read(pInfo->m_pdCenter,sizeof(double)*m_nLinkedImage);

				pInfo->m_pdCovariance = new double[m_nLinkedImage*m_nLinkedImage];
				infFile->Read(pInfo->m_pdCovariance,sizeof(double)*m_nLinkedImage*m_nLinkedImage);
				m_aThemeInfoArray.Add(pInfo);
			}
			CATCH( CFileException, e )		//Some error
			{
				AfxMessageBox("读文件出错!");
				return FALSE;
			}
			END_CATCH
		}
	}
	return TRUE;
}

// 保存遥感影象信息(要求文件已经打开,操作后不关闭)
BOOL CRSImage::SaveRsInfo(CFile * infFile)
{
	int i;

	TRY
	{
		// 写标志、影象类型、影象名字、成象日期和成象波长范围
		DWORD dwFlag = HEADERFLAG;
		infFile->Write(&dwFlag,sizeof(DWORD));
		infFile->Write(&m_nImgType,sizeof(int));
		infFile->Write(m_szImgName.GetBuffer(256),256);
		infFile->Write(&m_dwDateOfImage,sizeof(DWORD));
		infFile->Write(&m_MinWaveLength,sizeof(BYTE));
		infFile->Write(&m_MaxWaveLength,sizeof(BYTE));

		// 写宽、高、水平分辨率和垂直分辨率
		infFile->Write(&m_nImgWidth,sizeof(int));
		infFile->Write(&m_nImgHeight,sizeof(int));
		infFile->Write(&m_dXResolution,sizeof(double));
		infFile->Write(&m_dYResolution,sizeof(double));
		
		// 写地理分布范围
		for(i=0; i<8; i++)
		{
			infFile->Write(m_pdGeoPosition+i,sizeof(double));
		}

		// 写保留字节
		DWORD dwReserved = 0L;
		for(i=0; i<10; i++)
		{
			infFile->Write(&dwReserved,sizeof(DWORD));
		}
	
		// 写直方图信息
		if(m_pdwHistogram == NULL)
		{
			CalHistogram();				
		}
		if(m_nImgType == IMAGE_COMBINE)
			infFile->Write(m_pdwHistogram,sizeof(DWORD)*3*256);
		else
			infFile->Write(m_pdwHistogram,sizeof(DWORD)*256);
	}

	CATCH( CFileException, e )
	{
		AfxMessageBox("写文件时出错!");
		return FALSE;
	}
	END_CATCH

	// 写连接的影象信息
	CString * pszTemp;
	infFile->Write(&m_nLinkedImage,sizeof(int));
	for(i=0; i<m_nLinkedImage; i++)
	{
		pszTemp = (CString *)(m_aLinkedImageNameArray[i]);

⌨️ 快捷键说明

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