同态滤波器

这次使用的是经典教材——冈萨雷斯 数字图像处理(第二版)

P152-154  4.5同态滤波器   附上下载地址http://dl.dbank.com/c0atzs7h2g#

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">理论部分就不叨叨了,直接上代码,写的感觉有点问题,求指导。</span>
void HomoFilter(Mat srcImg, Mat &dst)
{
	srcImg.convertTo(srcImg, CV_64FC1);
	dst = Mat::zeros(srcImg.rows, srcImg.cols, CV_64FC1);

	// 构造滤波矩阵
	Mat H_u_v;
	double gammaH = 1.5;
	double gammaL = 0.5;
	double C = 1;
	double d0 = (srcImg.rows/2)*(srcImg.rows/2) + (srcImg.cols/2)*(srcImg.cols/2);
	double d2 = 0;
	H_u_v = Mat::zeros(srcImg.rows, srcImg.cols, CV_64FC1);
	for (int i = 0; i < srcImg.rows; i++)
	{
		double * dataH_u_v = H_u_v.ptr<double>(i);
		for (int j = 0; j < srcImg.cols; j++)
		{
			d2 = pow((i - srcImg.rows/2), 2.0) + pow((j - srcImg.cols/2), 2.0);
			dataH_u_v[j] = 	(gammaH - gammaL)*(1 - exp(-C*d2/d0)) + gammaL;  
		}
	}

	for (int i = 0; i < srcImg.rows; i++)
	{
		double* srcdata = srcImg.ptr<double>(i);
		double* logdata = dst.ptr<double>(i);
		for (int j = 0; j < srcImg.cols; j++)
		{	
			logdata[j] = log(srcdata[j]+1.0);
		}
	}

	//%%%%%%%%%%%%%%%%%%%%%%%傅里叶变换、滤波、傅里叶反变换%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	Mat planes[] = {dst, Mat::zeros(dst.size(), CV_64F)};
	Mat complexI;
	merge(planes, 2, complexI); // Add to the expanded another plane with zeros
	dft(complexI, complexI);    // this way the result may fit in the source matrix
	// compute the magnitude and switch to logarithmic scale
	// => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
	split(complexI, planes); 
	Mat IDFT[] = {Mat::zeros(dst.size(), CV_64F), Mat::zeros(dst.size(), CV_64F)};
	IDFT[0] = H_u_v.mul(planes[0]);//planes[0].mul(H_u_v);
	IDFT[1] = H_u_v.mul(planes[1]);//planes[1].mul(H_u_v);

	merge(IDFT, 2, complexI); 
	idft(complexI, complexI);
	split(complexI, IDFT); 

	for (int i = 0; i < srcImg.rows; i++)
	{
		double* dataRe = IDFT[0].ptr<double>(i);
		double* dataIm = IDFT[1].ptr<double>(i);
		double* logdata = dst.ptr<double>(i);

		for (int j = 0; j < srcImg.cols; j++)
		{	
			if (dataIm[j] < 0)
			{
				logdata[j]  = dataRe[j]*dataRe[j] - dataIm[j]*dataIm[j];
			}
			else
			{
				logdata[j]  = dataRe[j]*dataRe[j] + dataIm[j]*dataIm[j];
			}
		}
	}


	normalize(dst, dst, 0, 5.545, CV_MINMAX); 	

	for (int i = 0; i < srcImg.rows; i++)
	{
		double* logdata = dst.ptr<double>(i);
		for (int j = 0; j < srcImg.cols; j++)
		{	
			logdata[j] = pow(2.718281828, logdata[j]) - 1.0;
		}
	}
	dst.convertTo(dst, CV_8UC1);;

}


猜你喜欢

转载自blog.csdn.net/u012033076/article/details/44871053