同态滤波器

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

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);;

}
时间: 2024-11-05 16:24:31

同态滤波器的相关文章

同态滤波

在生活中会得到这样的图像,它的动态范围很大,而我们感兴趣的部分的灰度又很暗,图像细节没有办法辨认,采用一般的灰度级线性变换法是不行的.图像的同态滤波属于图像频率域处理范畴,其作用是对图像灰度范围进行调整,通过消除图像上照明不均的问题,增强暗区的图像细节,同时又不损失亮区的图像细节. 我们人眼能分别得出图像的灰度不仅仅是由于光照函数(照射分量)决定,而且还与反射函数(反射分量)有关,反射函数反映出图像的具体内容.光照强度一般具有一致性,在空间上通常会有缓慢变化的性质,在傅立叶变换下变现为低频分量,

同态滤波(Homomorphic filtering)

引言 一副图像f(x,y)可以表示为其照度分量i(x,y)和反射分量r(x,y)的乘积,由于照度相对变化很小,可以看作是图像的低频成份,而反射率则是高频成份.通过分别处理照度和反射率对像元灰度值的影响,达到揭示阴影区细节特征的目的. 算法 对于一副图像f(x,y)可由照射分量i(x,y)和反射分量r(x,y)的乘积,即 f(x,y)=i(x,y)r(x,y) 上式不能直接用于对照度和反射的频率分量进行操作,因此上式取对数 Inf(x,y)=lni(x,y)+lnr(x,y) 对上式两边取傅里叶变

图像增强之——同态滤波

说明:同态滤波是频域滤波的一种,但是相比之下同态滤波有自己的优势, 频域滤波可以灵活地解决加性噪声问题,但无法消减乘性或卷积性噪声. 同态滤波是一种在频域中同时将图像亮度范围进行压缩和将图像对比度进行增强的方法,是基于图像成像模型进行的. 一幅图f(x,y)可以表示成照度分量i(x,y)与反射分量r(x,y)的乘积,同态滤波基本思想: 为了分离加性组合的信号,常采用线性滤波的方法,而非加性信号组合常用同态滤波的技术将非线性问题转化成线性问题处理,即先对非线性(乘性或者卷积性)混杂信号作某种数学运

基于OpenCV的同态滤波

在4.0.1节中,我们已经介绍了一个简单的图像形成模型,即照射-反射模型.这个模型可以开发一种频率处理程序,该程序可以同时压缩灰度范围和增强对比度来改善一幅图像的表现.图像形成的照射-反射模型的表达式如下: 6.4- 16 上式不能直接用于对照射和反射的频率分量进行操作,因为两个分量的傅里叶变换之积,不等于原图像的傅里叶变换: 6.4- 17 但是,我们可以定义如下变换关系: 6.4- 18 然后再对上式两边做傅里叶变换: 6.4- 19 得到下面的傅里叶变换域的等式: 6.4- 20 其中,

深度滤波器(3)——深度滤波器的原理及实现

在前两篇文章中,我们介绍了三角化恢复深度信息,并对三角化过程中的误差进行了分析和讨论. 今天,我们就进入我们这个系列的正题:深度滤波器的原理及实现. 一提到深度滤波器,大家肯定首先会觉得深不可测,听名字就觉得高大上.其实,有了前面的预备知识,不难理解今天要讲解的深度滤波器的原理. 我们今天给大家介绍的是比较简单的高斯分布假设下的深度滤波器. 高斯分布是自然界中最常见的一种分布形式,并且也符合绝大部分的自然情况.简单起见,我们先假设三角化后恢复的深度值符合高斯分布.对于像素点的深度值d,满足: P

OpenCV 学习(利用滤波器进行边缘提取)

OpenCV 学习(利用滤波器进行边缘提取) 通过低通滤波器,我们可以将图像平滑,相反的,利用高通滤波器可以提取出图像的边缘. Sobel 滤波器 Sobel 滤波器是一种有方向性的滤波器,可以作用在 X 方向或 Y 方向. 关于这种滤波器的理论介绍可以参考: https://en.wikipedia.org/wiki/Sobel_operator 函数原型如下: void Sobel( InputArray src, OutputArray dst, int ddepth, int dx, i

FPGA的FIR抽取滤波器设计

摘 要:本文介绍了FIR抽取滤波器的工作原理,重点阐述了用XC2V1000实现FIR抽取滤波器的方法,并给出了仿真波形和设计特点. 关键词:FIR抽取滤波器:流水线操作:FPGA 用FPGA实现抽取滤波器比较复杂,主要是因为在FPGA中缺乏实现乘法运算的有效结构,现在,FPGA中集成了硬件乘法器,使FPGA在数字信号处理方面有了长足的进步.本文介绍了一种采用Xilinx公司的XC2V1000实现FIR抽取滤波器的设计方法. 具体实现 结构设计 基于抽取滤波器的工作原理,本文采用XC2V1000实

卡尔曼滤波器

卡尔曼的历史不讲了... 网上写卡尔曼滤波器的太多了...而且大(yi)多(mu)雷(yi)同(yang),所以,我也不知道谁是第一稿,谁是转载者,这里...我也是参考别人的博文.将卡尔曼滤波器用在了一个GPS的小程序里,最简单的一维模型... 首先,我们先要引入一个离散控制过程的系统.该系统可用一个线性随机微分方程(Linear Stochastic Difference equation)来描述: X(k)=A*X(k-1)+B*U(k)+W(k) 再加上系统的测量值: Z(k)=H*X(k

卡尔曼滤波器的简单推导

本文将简单推导卡尔曼滤波器的预测和更新公式.为了简单,使用标量(一维向量)而不是向量,并且假设系统没有输入. 系统状态的理论值如下: $x_k=\Phi_k x_{k-1}+w_k$ 但是由于过程噪声和观测噪声的存在,系统状态的真实值是不可知的.但我们仍可以根据以下思路,尽量跟踪真实值: 1) 状态转换系数是已知的,因此我们可以根据上一状态得到当前状态的先验估计: $\hat{x}_k^-=\Phi_k \hat{x}_{k-1}$ 2) 将对当前状态的先验估计$\hat{x}_k^-$变换到对