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

📄 freqpro.cpp

📁 用C++实现的数字图像处理各个算法源代码 我精心整理的 很难的啊 希望可以给大家带来帮助
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		double old_nargin=nargin_val; nargin_val=2.0; nargin_set=1;
    dMm(ncols); 
    dMm(ret1a);
    ret1a=dct2(arg1, mrows, ncols);
    nargin_val=old_nargin;
    return ret1a;
    end_scope
}

////////////////////////////////////////////////////////////////////////
//Mm bIs2Power()   
//----------------------------------------------------------------------
//基本功能:本函数为判断一个数是否为2的整次幂。
//----------------------------------------------------------------------
//参数说明:int nNum		输入的整数
//----------------------------------------------------------------------
//返    回:BOOL
//			是返回真,否返回假。
//----------------------------------------------------------------------
//注    意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CFreqPro::bIs2Power(int nNum)
{
	LONG	a;
	
	a = 1;

	while(a * 2 <= nNum)
	{
		a *= 2;
	}

	if(a == nNum) return TRUE;
	else
		return FALSE;
}

////////////////////////////////////////////////////////////////////////
//Mm idct()   
//----------------------------------------------------------------------
//基本功能:本函数完成一个向量X的一维离散余弦变换。
//----------------------------------------------------------------------
//参数说明:Mm b	待变换向量(若为矩阵,按列进行运算)
//			Mm n	变换长度,若指定该参数,则自动将向量a补0或自动裁剪到
//					指定长度。
//----------------------------------------------------------------------
//返    回:Mm
//			变换结果矩阵。
//----------------------------------------------------------------------
//注    意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct(Mm b, Mm n)
{
	//定义相关矩阵变量
	b.setname("b"); n.setname("n"); 
    dMm(a); dMm(do_trans); dMm(m); dMm(bb); dMm(ww); dMm(W); dMm(yy); dMm(y); 
    
    //判断输入参数是否正确
	double old_nargin=nargin_val;

	if (!nargin_set) nargin_val=2.0;

    nargin_set=0;
    double old_nargout=nargout_val; 

	if (!nargout_set) nargout_val=1.0;

    nargout_set=0;

	if (istrue(nargin()==0.0))
	{
		error(TM("输入参数为空,无法完成操作!."));
    }
    
	if (istrue(isempty(b))) 
	{
		
		error(TM("输入矩阵为空,无法完成操作!"));

		a = nop_M;
		
		nargin_val=old_nargin; nargout_val=old_nargout;		
		b.setname(NULL); n.setname(NULL); 

		return a;
	}
	
	//如果输入为一行向量,将其转换为列向量。
	do_trans = (size(b,1.0)==1.0);
	if (istrue(do_trans)) 
	{
		//是行向量,转换为列向量。
		//相当于Matlab的b=b(:)。
		b = b(c_p);
	}
	
	//只有一个输入参数,未指定变换点数n。	
	if (istrue(nargin()==1.0)) 
	{
		//得到第一维长度(矩阵列长度)
		n = size(b,1.0);
	}
	//得到第二维长度(矩阵行长度)
	m = size(b,2.0);

    //根据需要为矩阵补零或截去多余元素
	if (istrue(size(b,1.0)<n)) 
	{
		//矩阵列长度小于指定的变换点数
		//生成n×m的零矩阵
		bb = zeros(n,m);

		//从输入矩阵b中取得所需元素
		//相当于Matlab的bb(1:size(b,1),:) = b。
		bb(colon(1.0,1.0,size(b,1.0)),c_p) = b;
	} 
	else
	{
		//矩阵列长度大于或等于指定的变换点数
		//从输入矩阵b中取得所需元素
		//相当于Matlab的b = b(1:n,:)。
		bb = b(colon(1.0,1.0,n),c_p);
	}
	
    //计算用于IDFT计算的系数
	ww = msqrt(2.0*n)*transpose(exp(j*(colon(0.0,1.0,n-1.0))*pi/(2.0*n)));
	
	//进行变换
	if (istrue(rem(n,2.0)==1.0)||istrue(!isreal(b)))
	{
		//n为偶数
		//生成中间变换矩阵
		ww(1.0) = ww(1.0)*msqrt(2.0);
		W = ww(c_p,ones(1.0,m));
		//生成2.0*n×m的零矩阵
		yy = zeros(2.0*n,m);
		//相当于Matlab的yy(1:n,:) = W.*bb
		yy(colon(1.0,1.0,n),c_p) = times(W,bb);
		//相当于Matlab的yy(n+2:2*n,:) 。
		yy(colon(n+2.0,1.0,2.0*n),c_p) = -times(j*W(colon(2.0,1.0,n),c_p),flipud(bb(colon(2.0,1.0,n),c_p)));
		
		//调用Matrix<Lib>C++库函数IFFT()进行快速离散傅立叶逆变换,
		y = ifft(yy);
		
		//保留需要的变换结果数据
		//相当于Matlab的a = y(1:n,:)。
		a = y(colon(1.0,1.0,n),c_p);		
	}
	else
	{
		//n为奇数
		//计算校正系数
		ww(1.0) = ww(1.0)/msqrt(2.0);
		W = ww(c_p,ones(1.0,m));
		yy = times(W,bb);
		
		//调用Matrix<Lib>C++库函数IFFT()进行快速离散傅立叶逆变换,
		y = ifft(yy);
		
		//对矩阵的各列元素重新进行排序
		//生成n×m的零矩阵
		a = zeros(n,m);
		//相当于Matlab的a(1:2:n,:) = y(1:n/2,:)		
		a(colon(1.0,2.0,n),c_p) = y(colon(1.0,1.0,n/2.0),c_p);
		//相当于Matlab的a(2:2:n,:) = y(n:-1:n/2+1,:)
		a(colon(2.0,2.0,n),c_p) = y(colon(n,-1.0,n/2.0+1.0),c_p);
	}
	
	//如果输入矩阵是实数矩阵,输出取变换结果的实部。
	if (istrue(isreal(b)))
	{
		a = real(a);
	}
	//如果输入的是行向量,对结果进行转置操作。
	if (istrue(do_trans))
	{
		a = transpose(a);
	}
	
	nargin_val=old_nargin; nargout_val=old_nargout;

	b.setname(NULL); n.setname(NULL); 

	return a;
}

////////////////////////////////////////////////////////////////////////
//Mm idct()   
//----------------------------------------------------------------------
//基本功能:本函数为离散余弦变换的无参重载版本。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返    回:Mm
//			变换结果矩阵。
//----------------------------------------------------------------------
//注    意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct()
{
	begin_scope
		double old_nargin=nargin_val; nargin_val=0.0; nargin_set=1;
	dMm(b); dMm(n); 
	dMm(ret1a);
	ret1a=idct(b, n);
	nargin_val=old_nargin;
	return ret1a;
	end_scope
}

////////////////////////////////////////////////////////////////////////
//Mm idct()   
//----------------------------------------------------------------------
//基本功能:本函数为离散余弦变换的无指定变换长度重载版本。
//----------------------------------------------------------------------
//参数说明:Mm b	待变换向量(若为矩阵,按列进行运算)
//----------------------------------------------------------------------
//返    回:Mm
//			变换结果矩阵。
//----------------------------------------------------------------------
//注    意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct(Mm b)
{
	begin_scope
		double old_nargin=nargin_val; nargin_val=1.0; nargin_set=1;
	dMm(n); 
	dMm(ret1a);
	ret1a=idct(b, n);
	nargin_val=old_nargin;
	return ret1a;
	end_scope
}

////////////////////////////////////////////////////////////////////////
//Mm idct2()   
//----------------------------------------------------------------------
//基本功能:本函数完成矩阵的一维离散余弦逆变换。
//----------------------------------------------------------------------
//参数说明:Mm arg1		待变换矩阵
//			Mm mrows	行变换长度,若指定该参数,则自动将向量a补0或自动
//						裁剪到指定长度。
//			Mm ncols	列变换长度,若指定该参数,则自动将向量a补0或自动
//						裁剪到指定长度。
//----------------------------------------------------------------------
//返    回:Mm
//			变换结果矩阵。
//----------------------------------------------------------------------
//注    意:此函数声明为保护型,只能在CFreqPro类中使用。该函数是先对矩阵
//			按列进行一维离散余弦逆变换,再对其按列进行一维离散余弦逆变换,
//			最终得到其二维离散余弦逆变换结果。对程序在此不加详细注释,请
//			参考一维离散余弦逆变换程序注释。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct2(Mm arg1, Mm mrows, Mm ncols)
{
	arg1.setname("arg1"); mrows.setname("mrows"); ncols.setname("ncols"); 
	dMm(a); dMm(m); dMm(n); dMm(b); dMm(mpad); dMm(npad); 
	
	double old_nargin=nargin_val;
	if (!nargin_set) nargin_val=3.0;
	nargin_set=0;
	double old_nargout=nargout_val;
	if (!nargout_set) nargout_val=1.0;
	nargout_set=0;

	size(arg1,i_o,m,n);	

	if (istrue(nargin()==1.0))
	{
		if (istrue((m>1.0))&&istrue((n>1.0)))
		{
			a = transpose(idct(transpose(idct(arg1))));
			nargin_val=old_nargin; nargout_val=old_nargout;
			
			arg1.setname(NULL); mrows.setname(NULL); ncols.setname(NULL); 
			return a;
		}
		else
		{
			mrows = m;
			ncols = n;
		}
	}
	b = arg1;
	if (istrue(nargin()==2.0))
	{
		ncols = mrows(2.0);
		mrows = mrows(1.0);
	}
	mpad = mrows;
	npad = ncols;
	if (istrue(m==1.0)&&istrue(mpad>m))
	{
		b(2.0,1.0) = 0.0;
		m = 2.0;
	}
	if (istrue(n==1.0)&&istrue(npad>n))
	{
		b(1.0,2.0) = 0.0;
		n = 2.0;
	}
	if (istrue(m==1.0))
	{
		mpad = npad;
		npad = 1.0;
	}
	
	a = idct(b,mpad);
	if (istrue(m>1.0)&&istrue(n>1.0))
	{
		a = transpose(idct(transpose(a),npad));
	}
	
	nargin_val=old_nargin; nargout_val=old_nargout;
	
	arg1.setname(NULL); mrows.setname(NULL); ncols.setname(NULL); 
	return a;
}


////////////////////////////////////////////////////////////////////////
//Mm idct2()   
//----------------------------------------------------------------------
//基本功能:本函数为二维离散余弦逆变换的无指定变换长度重载版本。
//----------------------------------------------------------------------
//参数说明:Mm arg1	待变换矩阵
//----------------------------------------------------------------------
//返    回:Mm
//			变换结果矩阵。
//----------------------------------------------------------------------
//注    意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct2(Mm arg1)
{
	begin_scope
		double old_nargin=nargin_val; nargin_val=1.0; nargin_set=1;
	dMm(mrows); dMm(ncols); 
	dMm(ret1a);
	ret1a=idct2(arg1, mrows, ncols);
	nargin_val=old_nargin;
	return ret1a;
	end_scope
}

////////////////////////////////////////////////////////////////////////
//Mm idct2()   
//----------------------------------------------------------------------
//基本功能:本函数为二维离散余弦逆变换的无指定列变换长度重载版本。
//----------------------------------------------------------------------
//参数说明:Mm arg1		待变换矩阵
//			Mm mrows	行变换长度,若指定该参数,则自动将向量a补0或自动
//						裁剪到指定长度。
//----------------------------------------------------------------------
//返    回:Mm
//			变换结果矩阵。
//----------------------------------------------------------------------
//注    意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct2(Mm arg1, Mm mrows)
{
	begin_scope
		double old_nargin=nargin_val; nargin_val=2.0; nargin_set=1;
	dMm(ncols); 
	dMm(ret1a);
	ret1a=idct2(arg1, mrows, ncols);
	nargin_val=old_nargin;
	return ret1a;
	end_scope
}

////////////////////////////////////////////////////////////////////////
//BOOL NDCT2()   
//----------------------------------------------------------------------
//基本功能:本函数完成图像的快速余弦逆变换。
//----------------------------------------------------------------------
//参数说明:Mm matTransed	被变换的矩阵
//----------------------------------------------------------------------
//返    回:BOOL
//			成功时返回TRUE,失败时返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CFreqPro::NDCT2(Mm matTransed)
{
	//若未指定 CDibObject 对象指针返回FALSE
	if( m_pDibObject == NULL ) return( FALSE );

	//调用函数idct2()完成二维离散余弦变换
	m_matBits = idct2(matTransed);

	//将矩阵数据赋给图像数据区
	SetBits();
	
	return(TRUE);
}


⌨️ 快捷键说明

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