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

📄 wavelettransform.cpp

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

			// 求高频部分
			for(j=0; j<height-2; j=j+2)
			{
				pY[(height+j)/2] = -data[(j+1)*imgWidth+i] + (pY[j/2]+pY[j/2+1])/2;
			}	
			pY[height-1] = -data[(height-1)*imgWidth+i] + pY[height/2-1];

			// 更新原始数据
			for(j=0; j<height;j++)
				data[j*imgWidth+i] = pY[j];
		}

		// 释放临时工作内存
		delete pX;
		delete pY;
	}
}

// 小波逆变换,要求遥感图像的宽度和高度均能被2^times整除.
void InvWTBIOTS2D2(float * data,int imgHeight,int imgWidth,int times)
{
	int i,j,scale,time;
	int width,height;
	
	//进行m次小波分解
	for(time=times-1; time>=0; time--)
	{
		// 为临时工作区申请内存
		scale = 1;
		for(i=0; i<time;i++)
			scale <<= 1;
		width  = imgWidth/scale;
		height = imgHeight/scale;
		float * pX  = (float *)new float[width];
		float * pY  = (float *)new float[height];
		if( pX==NULL || pY==NULL )
		{
			AfxMessageBox("申请内存失败!");
			if(pX != NULL) delete pX;
			if(pY != NULL) delete pY;
			return;
		}
		
		// 先进行列变换
		WORD pro,process = 0;
		for(i=0; i<width; i++)
		{
			// 进度指示
			pro=(int)(100.0 * (i+1) / width);
			if(pro>process)
			{
				for(j=0; j<pro-process; j++)
					UpdateStatusBar();
				process=pro;
			}

			// 先求出下标为奇数的信号
			for(j=0; j<height-2; j=j+2)
			{
				pY[j+1] = -data[imgWidth*(height+j)/2+i] + (data[imgWidth*j/2+i] + data[imgWidth*(j/2+1)+i])/2;
			}
			pY[height-1] = -data[(height-1)*imgWidth+i] + data[(height/2-1)*imgWidth+i];
			
			// 再求出下标为偶数的信号
			pY[0] = 2*data[i] - pY[1];
			for(j=2; j<height; j=j+2)
			{
				pY[j] = (4*data[(j/2)*imgWidth+i]-pY[j-1]-pY[j+1])/2;
			}

			for(j=0; j<height;j++)
				data[j*imgWidth+i] = pY[j];
		}
			
		// 再进行行变换
		for(i=0; i<height; i++)
		{
			// 进度指示
			pro=(int)(100.0 * (i+1) / height);
			if(pro>process)
			{
				for(j=0; j<pro-process; j++)
					UpdateStatusBar();
				process=pro;
			}

			// 先求出下标为奇数的信号
			for(j=0; j<width-2; j=j+2)
			{
				pX[j+1] = -data[i*imgWidth+(width+j)/2] + (data[i*imgWidth+j/2] + data[i*imgWidth+j/2+1])/2;
			}
			pX[width-1] = -data[i*imgWidth+width-1] + data[i*imgWidth+width/2-1];

			// 再求出下标为偶数的信号
			pX[0] = 2*data[i*imgWidth]-pX[1];
			for(j=2; j<width; j=j+2)
			{
				pX[j] = (4*data[i*imgWidth+j/2]-pX[j-1]-pX[j+1])/2;
			}
						
			for(j=0; j<width; j++)
				data[i*imgWidth+j] = pX[j];
		}

		// 释放临时工作内存
		delete pX;
		delete pY;
	}
}

// **********************S=3,D=1的情形**********************************

//             -1        0        1        2
// H[] = {    0.125,   0.375,   0.375,   0.125 };
// G[] = {    0.25,    0.75,   -0.75,   -0.25  };
//^H[] = {   -0.25,    0.75,    0.75,   -0.25  };
//^G[] = {   -0.125,   0.375,  -0.375,   0.125 };

// 小波变换,要求遥感图像的宽度和高度均能被2^times整除.
// 对边界作了对称延拓处理,比如 3 2 1 0 1 2 3.......
void WTBIOTS3D1(float * data,int imgHeight,int imgWidth,int times)
{
	int i,j,scale,time;
	int width,height;

	//进行m次小波分解
	for(time=0; time<times; time++)
	{
		// 为临时工作区申请内存
		scale = 1;
		for(i=0; i<time;i++)
			scale <<= 1;
		width  = imgWidth/scale;
		height = imgHeight/scale;
		
		float * pX = (float *)new float[width];
		float * pY = (float *)new float[height];
		if( pX==NULL || pY==NULL )
		{
			AfxMessageBox("申请内存失败!");
			if( pX != NULL )delete pX;
			if( pY != NULL )delete pY;
			return;
		}

		// 先进行行变换
		WORD pro,process = 0;
		for(i=0; i<height; i++)
		{
			// 进度指示
			pro=(int)(100.0 * (i+1) / height);
			if(pro>process)
			{
				for(j=0; j<pro-process; j++)
					UpdateStatusBar();
				process=pro;
			}

			// 左边界处理
			pX[0] = ( 3*data[i*imgWidth] + 4*data[i*imgWidth+1] + data[i*imgWidth+2] )/8;
			pX[width/2] = ( 3*data[i*imgWidth] - 2*data[i*imgWidth+1] - data[i*imgWidth+2] )/4;

			// 中间部分处理
			for(j=2; j<width-2; j=j+2)
			{
				pX[j/2] = ( data[i*imgWidth+j-1] + 3*data[i*imgWidth+j]
					        + 3*data[i*imgWidth+j+1] + data[i*imgWidth+j+2] )/8;
				pX[(j+width)/2] = ( data[i*imgWidth+j-1] + 3*data[i*imgWidth+j]
					        - 3*data[i*imgWidth+j+1] - data[i*imgWidth+j+2] )/4;
			}
			
			// 右边界处理
			pX[width/2-1] = (data[i*imgWidth+width-3] + 4*data[i*imgWidth+width-2] + 3*data[i*imgWidth+width-1])/8;
			pX[width-1] = (data[i*imgWidth+width-3] + 2*data[i*imgWidth+width-2] - 3*data[i*imgWidth+width-1])/4;

			// 更新原始数据
			for(j=0; j<width; j++)
				data[i*imgWidth+j] = pX[j];
		}
			
		// 再进行列变换
		for(i=0; i<width; i++)
		{
			// 进度指示
			pro=(int)(100.0 * (i+1) / width);
			if(pro>process)
			{
				for(j=0; j<pro-process; j++)
					UpdateStatusBar();
				process=pro;
			}

			// 上边界处理
			pY[0] = ( 3*data[i] + 4*data[imgWidth+i] + data[2*imgWidth+i] )/8;
			pY[height/2] = ( 3*data[i] - 2*data[imgWidth+i] - data[2*imgWidth+i] )/4;
			
			// 中间部分处理
			for(j=2; j<height-2; j=j+2)
			{
				pY[j/2] = ( data[(j-1)*imgWidth+i] + 3*data[j*imgWidth+i]
							+ 3*data[(j+1)*imgWidth+i] + data[(j+2)*imgWidth+i] )/8;
				pY[(height+j)/2] = ( data[(j-1)*imgWidth+i] + 3*data[j*imgWidth+i]
							- 3*data[(j+1)*imgWidth+i] - data[(j+2)*imgWidth+i] )/4;
			}

			// 下边界处理
			pY[height/2-1] = ( data[(height-3)*imgWidth+i] + 4*data[(height-2)*imgWidth+i]
							+ 3*data[(height-1)*imgWidth+i] )/8;
			pY[height-1] = ( data[(height-3)*imgWidth+i] + 2*data[(height-2)*imgWidth+i]
							- 3*data[(height-1)*imgWidth+i] )/4;
			
			// 更新原始数据
			for(j=0; j<height;j++)
				data[j*imgWidth+i] = pY[j];
		}

		// 释放临时工作内存
		delete pX;
		delete pY;
	}
}

// 小波逆变换,要求遥感图像的宽度和高度均能被2^times整除.
void InvWTBIOTS3D1(float * data,int imgHeight,int imgWidth,int times)
{
	int i,j,scale,time;
	int width,height;
	
	//进行m次小波分解
	for(time=times-1; time>=0; time--)
	{
		// 为临时工作区申请内存
		scale = 1;
		for(i=0; i<time;i++)
			scale <<= 1;
		width  = imgWidth/scale;
		height = imgHeight/scale;
		float * pXP  = (float *)new float[width/2];
		float * pXM  = (float *)new float[width/2];
		float * pYP  = (float *)new float[height/2];
		float * pYM  = (float *)new float[height/2];
		if( pXP==NULL || pXM==NULL ||
			pYP==NULL || pYM==NULL )
		{
			AfxMessageBox("申请内存失败!");
			if(pXP != NULL) delete pXP;
			if(pXM != NULL) delete pXM;
			if(pYP != NULL) delete pYP;
			if(pYM != NULL) delete pYM;
			return;
		}

		// 先进行列变换
		WORD pro,process = 0;
		for(i=0; i<width; i++)
		{
			// 进度指示
			pro=(int)(100.0 * (i+1) / width);
			if(pro>process)
			{
				for(j=0; j<pro-process; j++)
					UpdateStatusBar();
				process=pro;
			}

			// 获取中间值,取出全部有用信息,以便后面可以抹去工作数据原有信息
			for(j=0; j<height; j=j+2)
			{
				pYP[j/2] = 2*data[j/2*imgWidth+i] + data[(height+j)/2*imgWidth+i];
				pYM[j/2] = 2*data[j/2*imgWidth+i] - data[(height+j)/2*imgWidth+i];
			}

			// 先求出下标序号为1、2、3、4、5至2N-2的信号
			for(j=0; j<height-2; j=j+2)
			{
				data[(j+1)*imgWidth+i] = ( 3*pYM[j/2] - pYP[j/2+1] )/4;
				data[(j+2)*imgWidth+i] = ( 3*pYP[j/2+1] - pYM[j/2] )/4;
			}

			// 再求出下标序号为0、2N-1的信号
			data[i] = ( 2*pYP[0] - data[imgWidth+i] )/3;
			data[(height-1)*imgWidth+i] = ( 2*pYM[height/2-1] - data[(height-2)*imgWidth+i] )/3;
		}
			
		// 再进行行变换
		for(i=0; i<height; i++)
		{
			// 进度指示
			pro=(int)(100.0 * (i+1) / height);
			if(pro>process)
			{
				for(j=0; j<pro-process; j++)
					UpdateStatusBar();
				process=pro;
			}

			// 获取中间值,取出全部有用信息,以便后面可以抹去工作数据原有信息
			for(j=0; j<width; j=j+2)
			{
				pXP[j/2] = 2*data[i*imgWidth+j/2] + data[i*imgWidth+(width+j)/2];
				pXM[j/2] = 2*data[i*imgWidth+j/2] - data[i*imgWidth+(width+j)/2];
			}

			// 先求出下标序号为1、2、3、4、5、2N-2的信号
			for(j=0; j<width-2; j=j+2)
			{
				data[i*imgWidth+j+1] = ( 3*pXM[j/2] - pXP[j/2+1] )/4;
				data[i*imgWidth+j+2] = ( 3*pXP[j/2+1] - pXM[j/2] )/4;
			}

			// 再求出下标序号为0、2N-1的信号
			data[i*imgWidth] = ( 2*pXP[0] - data[i*imgWidth+1] )/3;
			data[i*imgWidth+width-1] = ( 2*pXM[width/2-1] - data[i*imgWidth+width-2] )/3;
		}

		// 释放临时工作内存
		delete pXP;
		delete pXM;
		delete pYP;
		delete pYM;
	}
}

⌨️ 快捷键说明

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