DNA图谱 / 问答 / 问答详情

数字图像处理中传统的复原方法与现代的复原方法的区别?

2023-07-11 13:05:58
TAG: 区别
共1条回复
出投笔记

图像复原技术及其MATLAB实现

摘 要

图像复原的目的是从观测到的退化图像重建原始图像,它是图像处理、模式识别、机器视觉等的基础,在天文学、遥感成像、医疗图像等领域获得了重要应用。运动模糊图像的复原是图像复原的重要组成部分。

由运动模糊图像复原出原图像关键问题是获取点扩展函数,模糊方向和长度的鉴别至关重要。本文通过对运动模糊图像的频域幅度图的黑带条纹(即图像零点个数)分析,计算出运动模糊PSF的参数。

获得PSF的参数后,本文主要采用了逆滤波法、维纳滤波法、最小线性二乘法、Richardson-Lucy算法对模糊图像进行复原,并对各种复原方法的结果进行了分析与对比。

关键词:图像复原;运动模糊;模糊方向;模糊长度

引 言

图像复原是图像处理领域一个具有现实意义的课题。运动模糊图像的研究越来越受到关注,这种模糊是成像过程中普遍存在的问题,其复原在许多领域都有广泛的应用。

实际上,图像复原设计三个方面的内容:退化图像的成像模型,图像复原算法和复原图像的评价标准。不同的成像模型、问题空间、优化规则和方法都会导致不同的图像复原算法,适用于不同的应用领域。现有的复原方法概括为以下几个类型:去卷积复原算法、线性代数复原、图像盲反卷积算法等,其他复原方法多是这三类的衍生和改进。其中,去卷积方法包括维纳去卷积、功率谱平衡与几何平均值滤波等,这些方法都是非常经典的图像复原方法。但是需要有关于原始图像、降质算子较多的先验信息和噪声平衡性的假设只适合于不变系统及噪声于信号不相关的情形,特别是降质算子病态的情况下,图像复原结果还不太理想。

由于图像复原技术在图像处理中占有重要的地位,已经形成了一些经典的常用图像复原算法,如无约束最小二乘法、有约束最小二乘方法、逆滤波、维纳、最大熵复原等,至今还被广泛使用。但这些复原算法都是假设系统的点扩散函数PSF(即系统对图像中点的脉冲响应,是导致图像退化的原因)为已知,实际情况是系统的点扩散函数由于大气扰动、光学系统的相差、相机和对象之间的相对运动等多种因素的影响,往往是未知的。这就需要人们用某种先验知识在系统的点扩散函数未知时进行估计,然而这种先验知识并不容易取得也不够精确,这就需要我们在对己模糊图像分析和处理的基础之上估计最逼近的PSF。

在运动模糊方向的鉴别方面,由于匀速直线运动的点扩散函数是矩形函数,其模糊图像对应的频域上有周期性的零值条纹,运动方向与零值条纹方向相垂直,本文就是借用此法获取模糊图像的PSF参数。本文主要针对运动模糊图像的复原进行研究,讨论分析了匀速直线运动模糊的退化模型,研究了运动方向和模糊尺度的估计,介绍了常用的几种图像复原方法。对模糊图像用几种复原算法分别进行了复原,根据复原结果,讨论分析了各算法的优缺点及适用的恢复环境。

第1章 绪论

1.1 研究背景

图像复原是数字图像处理中的一个重要课题。它的主要目的是改善给定的图像质量并尽可能恢复原图像。图像在形成、传输和记录过程中,受多种因素的影响,图像的质量都会有不同程度的下降,典型的表现有图像模糊、失真、有噪声等,这一质量下降的过程称为图像的退化。图像复原的目的就是尽可能恢复被退化图像的本来面目。

在成像系统中,引起图像退化的原因很多。例如,成像系统的散焦,成像设备与物体的相对运动,成像器材的固有缺陷以及外部干扰等。成像目标物体的运动,在摄像后所形成的运动模糊。当人们拍摄照片时,由于手持照相机的抖动,结果像片上的景物是一个模糊的图像。由于成像系统的光散射而导致图像的模糊。又如传感器特性的非线性,光学系统的像差,以致在成像后与原来景物发生了不一致的现象,称为畸变。再加上多种环境因素,在成像后造成噪声干扰。人类的视觉系统对于噪声的敏感程度要高于听觉系统,在声音传播中的噪声虽然降低了质量,但时常是感觉不到的。但景物图像的噪声即使很小都很容易被敏锐的视觉系统所感知。图像复原的过程就是为了还原图像的本来面目,即由退化了的图像恢复到能够真实反映景物的图像。

在交通系统、刑事取证中图像的关键信息至关重要,但是在交通、公安、银行、医学、工业监视、军事侦察和日常生活中常常由于摄像设备的光学系统的失真、调焦不准或相对运动等造成图像的模糊,使得信息的提取变得困难。但是相对于散焦模糊,运动模糊图像的复原在日常生活中更为普遍,比如高速运动的违规车辆的车牌辨识,快速运动的人群中识别出嫌疑人、公安刑事影像资料中提取证明或进行技术鉴定等等,这些日常生活中的重要应用都需要通过运动模糊图像复原技术来尽可能地去除失真,恢复图像的原来面目。因此对于运动模糊图像的复原技术研究更具有重要的现实意义。

1.2 相关领域的研究现状及存在的问题

图像恢复是数字图像处理中的一个重要分支,它研究的是如何从所得的退化图像中以最大的保真度复原出真实图像。成像系统的缺陷,传播媒介中的杂质,以及图像记录装置与目标之间的相对运动等因素,都不可避免地造成了图像的某些失真和不同程度的降质。然而在众多的应用领域中,又需要清晰的、高质量的图像,因此,图像恢复问题具有重要的意义。

与图像增强相似,图像复原的目的也是改善图像的质量。图像复原可以看作图像退化的逆过程,是将图像退化的过程加以估计,建立退化的数学模型后,补偿退化过程造成的失真,以便获得未经干扰退化的原始图像或图像的最优估计值,从而改善图像质量。图像复原是建立在退化的数学模型基础上的,且图像复原是寻求在一定优化准则下的原始图像的最优估计,因此,不同的优化准则会获得不同的图像复原,图像复原结果的好坏通常是按照一个规定的客观准则来评价的。

运动模糊图像的恢复是图像恢复中的重要课题之一,随着科学技术的不断发展,它在各个领域中的应用越来越多,要求也越来越高,可广泛应用于天文、军事、道路交通、医学图像、工业控制及侦破领域,具有重要的现实意义。

图像复原作为图像处理的一个重要领域,对于该问题国内外展开了诸多关键技术的研究。实际上,图像复原涉及三个方面的内容:退化图像的成像模型,图像复原算法和复原图像的评价标准。不同的成像模型、问题空间、优化规则和方法都会导致不同的图像复原算法。适用于不同的应用领域。现有的复原方法概括为以下几个类型:去卷积复原算法、线性代数复原、图像盲反卷积算法等,其他复原方法多是这三类的衍生和改进。其中,去卷积方法包括维纳去卷积、功率谱平衡与几何平均值滤波等,这些方法都是非常经典的图像复原方法。但是需要有关于原始图像、降质算子较多的先验信息和噪声平衡性的假设只适合于不变系统及噪声于信号不相关的情形,特别是降质算子病态的情况下,图像复原结果还不太理想。

线性代数复原技术是基于已知降质算子和噪声的统计特征,从而利用线性代数原理的复原技术,它为复原滤波器的数值提供了一个统一的设计思路和较透彻的解释。但是当降质函数有接近零的特征值时,复原的结果对噪声特别敏感,且该方法是把整幅图像一并处理,计算量大,同时也没有考虑纹理、边界等高频信号与噪声的区别,这将使纹理、边界等重要特征在图像复原过程中被破坏。针对这些问题,国外主要在改进算法的效率上做了许多工作,如全局最小二乘法、约束总体最小二乘法和正则化约束总体最小二乘法。

图像盲反卷积是图像复原的另一个重要的手段,它针对没有或少有关于降质函数和真实信号灯先验知识的复原问题,直接根据退化图像来估计降质函数和真实信号。目前有以下几种算法:零叶面分离法、预先确定降质函数法、三次相关法、迭代盲反卷积法等。这些算法在先验信息不足的情况下对降质图像进行复原,由于原始图像以及点扩展函的先验知识只是部分已知的,造成图像复原的解往往不唯一,而且解的好坏与初始条件的选择以及附加的图像假设等直接有关。同时,由于加性噪声的影响使得图像的盲目复原成病态。即若对点扩展函数直接求逆进行复原,通常会带来高频噪声放大的问题导致算法性能的恶化,所以当图像的信噪比水平较低时获得的结果往往不太理想。

正则化方法作为一种解决病态反问题的常用方法,通常用图像的平滑性作为约束条件,但是这种正则化策略通常导致复原图像的边缘模糊。为了克服边缘退化问题,最近几年,不少学者对各种“边缘保持”的正则化方法进行了比较深入的研究,提出了一些减少边缘退化的正则化策略,这些策略通常需要引入非二次正则化泛函,从而使问题的求解成为一个非线性问题。沿着这一思路,Geman和Yang提出了“半二次正则化”的概念来解决这种策略中出现的非线性优化问题。其后,Charbonni等人在此基础上研究了一种新的半二次正则化方法。从而可以利用确定性算法来得到问题的最优解。另一个较新的发展使Vogel等人提出的基于全变差模型的图像复原算法。尽管这些算法都在一定意义上提高了复原图像的质量,但边缘模糊的问题并未得到理想的解决。

另外,近年来小波的理论得到迅速发展,并光法应用于图像复原中。基于小波变换的迭代正则化图像复原算法,兼顾抑制噪声的增长和保留图像的重要边界。具有噪声估计能力的图像恢复正则化方法。Belge等人以广义高斯模型作为小波系数的先验分布,提出了一种小波域边缘保持正则化的方法。同时给出了小波域图像复原的一般框架,但其复原方法相对于传统复原方法提高的并不显著,赵书斌等人以混合高斯模型逼近小波系数的分布,并引入小波域隐马尔可夫模型作为自然图像的先验概率模型对图像超分辨率复原问题进行正则化,复原效果不错,但该方法还是不能避免计算量过大的缺点。从图像复原的Bayesian框架出发,小波域局部高斯模型的线性图像复原方法,该方法较好的再现了图像的各种边缘信息,取得不错的复原效果。

2 逆滤波复原

图5-1逆滤波复原过程图,图(a)是选取的原始图像,图(b)是利用MATLAB对原始图像进行运动模糊和加噪声仿真而生成的仿真图像,模糊长度为10个像素。经过逆滤波复原图像为图(c)。

(a)原图像 (b)模糊加噪图像

(c)复原图像

图5-1 逆滤波复原过程

从恢复出来的图5-1(c)可以看出复原效果不理想,出现较大的振铃现象。从理论分析上看是由于一般情况下,逆滤波复原不能正确估计退化函数

的零点,因此必须采用一个折中的方法进行解决。实际上,逆滤波不用

,而是采用另外一个关于

的函数

。函数

称为转移函数。改进方法为

(5-1)

式中K和d均为小于1的常数。

采用逆滤波对运动模糊加噪图像进行复原。在噪声相同情况下,参数K分别选取0.0001、0.001、0.005、0.01、0.1和0.9。图中(a)-(f)为对应参数下的复原图像。通过转移函数替代原退化模型得到图5-2逆滤波减小振铃现象复原图像。

(a)k=0.0001 (b) k=0.001

(c)k=0.005 (d) k=0.01

(e) k=0.1 (f) k=0.9

图5-2 逆滤波减小振铃现象复原图像图

从复原结果图5-2可以看出随着K值的增大复原效果逐渐变差,K=0.001到0.01之间复原效果较好。

从理论上分析,逆滤波方法不能正确估计退化函数

的零点。采用一个折衷的方法加以解决。一般情况,可以将图像的退化过程视为一个具有一定带宽的带通滤波器,随着频率的升高,该滤波器的带通特性很快下降,即

的幅度随着

平面原点的距离的增加而迅速下降,而噪声项

的幅度变化是比较平缓的。在远离平面的

的值就会变得很大,而对于大多数图像来说,

却变小,在这种情况下,噪声反而占优势,自然无法满意的恢复出原图像。这一规律说明,应用逆滤波时仅在原点领域采用

方能有效。

5.3 有约束最小二乘方复原的实现

通过MATLAB仿真来实现有约束的最小二乘方复原,图5-3是有约束的最小二乘方复原图。分别取参数为0、1、0.001、0.01、0.05、0.1对应图5-3里面的(a)-(f)。

图5-3 有约束最小二乘方在不同参数下的恢复情况图

5.4 维纳滤波复原的实现

图(a)是选取的原始图像,图(b)是利用MATLAB对原始图像进行运动模糊和加噪声仿真而生成的仿真图像,模糊长度为5个像素。

采用维纳滤波恢复算法对模糊图像进行恢复,在加噪声的情况下,参数k分别选取0.0001、0.001、0.005、0.01、0.1和1。各种图中(c)-(h)为对应参数下的恢复图像。图5-4有噪声下维纳滤波在不同参数下的恢复情况。

(a)原始图像 (b)含噪声运动模糊图像d=5,v=0.001

(c) K=0.0001 (d) K=0.001

(e) K=0.005 (f) K=0.01

(g) K=0.1 (h) K=1

图5-4 有噪声下维纳滤波在不同参数下的恢复情况

可以看出,恢复图像还是都有一定的振铃现象。K=0.0001时,图像振铃效应比较小,但其噪声很大。k=0.00l相对前一幅恢复图像振铃效应明显一点,但噪声有所减少。k=0.005和k=0.01的恢复效果也是看起来区别不明显,虽然它们的噪声都减少了,但图像整体都相对前面有明显的模糊,且振铃效应明显。K=0.1的模糊程度比较大,而k=1时,图像最模糊,且亮度很暗。

总的看来,主观评价认为k=0.001时的恢复效果最清楚,恢复质量最好。K=0.0001时次之,k=1时的效果最差。

利用公式(5-1)与(5-2)计算出平均平方误差,如表5-1所示:

表5- 1平均平方误差客观评价方法得分

参数k 0.0001 0.001 0.005 0.01 0.1 1

平均平方误差(M) 2861 6463 6937 6576 2861 2513

从表5-1可以看出,采用平均平方误差准则时K=0.1的平均平方误差和K=0.0001一样,但是其对应的图像很模糊。对于非迭代方法的维纳滤波恢复法,k值的选取对图像恢复质量有很重要的影响。从上面实验结果可以看出,虽然对于每幅特定图像的评价得分不尽相同,但基本上当k值在[0.001,0.1]的范围取值时,恢复图像质量最好。

从理论上分析,维纳滤波复原的图像,在图像的频率特征和附加噪声已知的情况下,采用维纳滤波去卷积比较有效。维纳滤波复原法不存在极点,即当

很小或变为零时,分母至少为K,而且

的零点也转换成了维纳滤波器的零点,抑制了噪声,所以它在一定程度上克服了逆滤波复原方法的缺点。

5.5 Richardson-Lucy复原的实现

图(a)是原始图像,图(b)是对原图进行运动模糊仿真而生成的仿真图像,模糊长度为10个像素,模糊方向为水平方向。

采用Richardson-Lucy恢复算法对模糊图像进行恢复,迭代次数参数分别选取20次、50次、100次、150次、200次和300次。所有图的(c-h)为对应迭代次数下的复原图像。

(a) 原图像 (b) 水平运动10像素加噪声图像

(c) 迭代20次 (d) 迭代50次

(e) 迭代100次 (f) 迭代150次

(g) 迭代200次 (h) 迭代300次

图5-5 R-L算法在不同参数下的复原图像

从图5-5可以看出,恢复的图像整体差别不大。从图像人物、背景等分辨,质量随着迭代次数增大而提高。迭代100次以后恢复效果区别不大,仔细辨认,迭代200次和300次更好一些.所以主观评价认为200次或300次时复原质量最好。

本文通过MATLAB编程,利用公式(5-1)、(5-2)计算出图5-5:(c)-(h)各恢复图像的平均平方误差。通过计算平均平方误差的倒数(M)来做客观分析。客观分析如表5-2:

表5- 2复原图像与原图像的平均平方误差

迭代次数 20 50 100 150 200 300

平均平方误差(M) 4348 4762 5000 5263 5263 5263

从表5-2可以看出,采用均方误差准则评价时,平均平方误差差别不大。总体上随着迭代次数增加分数增大,迭代次数为150次后平均平方误差一样。

上述分析表明,在R-L恢复算法下,对于这幅图像,传播波方程客观评价准则和平均平方误差准则的评价结果基本一致,并和主观评价结果吻合。

从理论上分析,Richardson-Lucy算法能够按照泊松噪声统计标准求出与给定PSF卷积后,最有可能成为输入模糊图像的图像。PSF已知但是图像噪声信息未知时,也可以使用这个函数进行有效的工作。随着复原迭代的次数增加,可以提高复原图像的似然性,最终将会收敛在具有最大似然性处。

结论与展望

图像复原是图像处理领域一个具有现实意义的课题。运动模糊图像的研究越来越受到关注,这种模糊是成像过程中普遍存在的问题,其复原在许多领域都有广泛的应用。

图像复原需要根据相应的退化模型知识重建或恢复原始的图像。也就是说,图像复原技术就是要将图像退化的过程模型化,并由此采取相反的过程以得到原始图像。运动模糊是由于在拍摄过程中相机与景物之间相对运动而产生,因此对于匀速直线运动造成的运动模糊图像来说,图像退化模型的两个重要参数相对运动的方向和运动模糊尺度的估计就成了图像复原的关键问题。本文以匀速直线运动造成的模糊图像为基础,研究退化函数的参数估计方法,所做的工作及创新之处总结如下:

论文的工作总结

(1)论文研究了模糊图像尤其是水平方向运动模糊图像的退化模型,任意方向的匀速直线运动模糊图像只需要通过坐标旋转至水平方向,其图像特征的描述可由水平匀速直线运动模糊图像类推得出。

(2)论文研究了运动方向和模糊尺度的估计,通过对运动模糊图像的频域幅度图的黑带条纹(即图像零点个数)分析来估算出运动模糊PSF的参数运动模糊方向和运动模糊长度)的,同时通过查阅文献获得另一种对模糊尺度的估算即对模糊图像进行一阶微分,然后进行自相关运算,可得到一条鉴别曲线,曲线上会出现对称的相关峰,峰值为负,两相关峰之间的距离等于运动模糊长度。

(3)对于运动模糊图像的恢复,介绍分析了逆滤波、有约束的最小二乘方、维纳滤波和Richardson-Lucy四种常用的恢复方法。并且采用Richardson-Lucy迭代算法和维纳滤波方法在选取不同参数的情况下对运动模糊图像进行了恢复。利用逆滤波方法进行恢复时,复原图像的效果整体不是很好,存在着较明显的振铃效应,加噪情况下复原图像的噪声也比较严重。本文通过理论分析及仿真,探索出减小振铃现象的一些方法,但还不够完善,今后还需要继续深入研究如何改进算法、减少振铃效应和噪声,以提高复原图像的质量。针对有约束的最小二乘方、维纳滤波复原方法,本文主要通过参数变化来控制复原效果,最终选出最优准则。Richardson-Lucy迭代算法从理论上看是迭代次数越大,复原效果越好。考虑到程序的有效性,本文采用了最大为迭代300次。从主客观评价对复原图像的评价来看迭代次数超过150次以后效果就基本一样。

展望

由于本人的能力有限,对图像复原技术的研究还不够系统、不够深入,无论在理论上,还是在工程应用中,还需要做大量深入、细致的研究工作。因此在这方面的研究还只是个开始,很多地方都需要改进与提高,例如:

(1)运动模糊图像的复原大多是对整幅图像进行全局的复原,然而在实际应用中并非完全如此。例如,由于物体运动而产生的相对运动,其运动模糊只出现在物体运动的轨迹上,而背景是清晰的。在这种情况下就不能对全局进行处理,应首先分割出运动模糊区域,然后再进行参数估计,图像复原。如何分割运动模糊区域,分割的依据如何等将成为以后研究工作的一部分。

(2)本文研究的运动模糊图像参数估计算法仅限于匀速直线运动造成的模糊,而缺乏对非匀速的、轨迹为曲线的运动模糊研究,且得到的参数还具有一定的误差。

参考文献

[1] 杨帆,等.数字图像处理与分析(第二版)[M].北京:航空航天大学出版社,2007.

[2] 黄爱民,等.数字图像处理分析基础[M].北京:中国水利水电出版社,2005.

[3] 孙兆林.MATLAB 6.x图像处理[M].北京:科学出版社,2003.

[4] 贾永红.计算机图像处理与分析[M].武汉:武汉大学出版社,2001.

[5] 姚敏.数字图像处理[M].北京:机械工业出版社,2006.

[6] 孟永定,马佳.基于MATLAB实现数字图像恢复[J].电脑学习,2007,1(1),30-32.

[7] 刘红岩,徐志鹏.基于MATLAB的数字图像恢复[J].科技信息(学术研究).2008,3(12),23-26.

[8] 孟昕,张燕平.运动模糊图像恢复的算法研究与分析[J].计算机技术与发展,2007,17(8):74-76.

[9] 孟昕,周琛琛,郝志廷.运动模糊图像恢复算法相关研究发展概述[J].安徽电子信息职业技术学院学报,2008,7(6),38-41.

[10] 曾志高,谭骏珊.匀速直线运动模糊图像的恢复技术研究[J].陕西理工学院学报(自然科学版),2006,22(2),36-38.

[11] 李云浩,王建设.匀速直线运动模糊图像的退化数学模型试验研究[J].江西理工大学学报,2006,27(4),28-30.

[12] 谢伟,秦前清.基于倒频谱的运动模糊图像PSF参数估计[J].武汉大学学报(信息科学版).2008,5(02),30-32.

[13] Banham Mark M,Katsaggelos A K.Digital image restoration. IEEE Signal Processing Magazine . 1997.

[14] Mccallum B C.Blind deconvolution by simulated annealing. Optics Communitions . 1990.

[15] Hardie C and Boncelet C G.LUM filters: A class rank order based filters for smoothing and sharpening. IEEE Transactions on Signal Processing . 1993.

附录C 主要源程序

(1)模糊图像的傅里叶频谱获取

j=imread("车牌.jpg");

figure(1);

imshow(j);

title("原图像");

len=20;

theta=30;

psf=fspecial("motion",len,theta);

j1=imfilter(j,psf,"circular","conv");

figure,imshow(j1);

title("PSF模糊图像");

J=rgb2gray(j);

K=fft2(J); %傅里叶变换

M=fftshift(K); %直流分量移到频谱中心

N=abs(M); %计算频谱幅值

P=(N-min(min(N)))/(max(max(N))-min(min(N)))*225;%归一化

Figure;

imshow(P);

title("原图像的傅里叶变换频谱");

J1=rgb2gray(j1);

K1=fft2(J1); %傅里叶变换

M1=fftshift(K1); %直流分量移到频谱中心

N1=abs(M1);%计算频谱幅值

P1=(N1-min(min(N1)))/(max(max(N1))-min(min(N1)))*225;%归一化

Figure;

imshow(P1);

title("模糊图像的傅里叶变换频谱");

(2)模糊长度获取程序

f1=rgb2gray(j1);

f1=im2double(f1);

h = fspecial("Sobel"); %Sobel算子

J = conv2(f1,h,"same"); %Sobel算子微分

IP=abs(fft2(J)); %图像能量谱密度

S=fftshift(real(ifft2(IP)));

figure,plot(S);

title

相关推荐

imfilter函数的介绍

imfilter函数叫做实现线性空间滤波函数。功能:对任意类型数组或多维图像进行滤波。
2023-07-10 20:43:281

matlab 中imfilter与和conv2具体在运算上是什么区别?imfilter的相关运算是什么意思?

imfilter实现的是线性空间滤波; conv2是计算两个矩阵的二维卷积1、MATLAB中提供了卷积运算的函数命令conv2,其语法格式为: C = conv2(A,B) C = conv2(A,B)返回矩阵A和B的二维卷积C。若A为ma×na的矩阵,B为mb×nb的矩阵,则C的大小为(ma+mb+1)×(na+nb+1)。 2、MATLAB图像处理工具箱提供了基于卷积的图象滤波函数filter2,filter2的语法格式为: Y = filter2(h,X) 其中Y = filter2(h,X)返回图像X经算子h滤波后的结果,默认返回图像Y与输入图像X大小相同。例如: 其实filter2和conv2是等价的。MATLAB在计算filter2时先将卷积核旋转180度,再调用conv2函数进行计算。 Fspecial函数用于创建预定义的滤波算子,其语法格式为: h = fspecial(type) h = fspecial(type,parameters) 参数type制定算子类型,parameters指定相应的参数,具体格式为: type="average",为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]。 type= "gaussian",为高斯低通滤波器,参数有两个,n表示模版尺寸,默认值为[3,3],sigma表示滤波器的标准差,单位为像素,默认值为0.5
2023-07-10 20:43:401

matlab filter2和imfilter有什么区别

imfilter 可进行多维图像(RGB等)进行空间滤波,且可选参数较多filter2 只能对二维图像(灰度图)进行空间滤波两个函数结果类型不一样,只需要在I1=filter2(h,I)后面加上I1=uint8(I1)进行类型转换,结果就是一样的。
2023-07-10 20:43:491

电脑imfiiter.dll什么意思

系统文件imfilter_mex.dll是存放在Windows系统文件夹中的重要文件,通常情况下是在安装操作系统过程中自动创建的,对于系统正常运行来说至关重要。在正常情况下不建议用户对该类文件(imfilter_mex.dll)进行随意的修改。它的存在对维护计算机系统的稳定具有重要作用。如果用户电脑被木马病毒、或是流氓软件篡改导致出现imfilter_mex.dll丢失、imfilter_mex.dll确实损坏等弹窗现象,可以用第三方软件修复,可在网上查找,下载后替换原文件。
2023-07-10 20:43:563

matlab图像处理 滤波方式

h=fspecial("gaussian",[9 9]),"replicate")中replicate指的是创建高斯滤波器,replicate 图像大小通过复制外边界的值来扩展(说白了都一样的,无明显区别功能:对任意类型数组或多维图像进行滤波。用法:B = imfilter(A,H)   B = imfilter(A,H,option1,option2,...)   或写作g = imfilter(f, w, filtering_mode, boundary_options, size_options)其中,f为输入图像,w为滤波掩模,g为滤波后图像。filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:选项描述filtering_mode‘corr"通过使用相关来完成,该值为默认。‘conv"通过使用卷积来完成boundary_options‘X"输入图像的边界通过用值X(无引号)来填充扩展其默认值为0‘replicate"图像大小通过复制外边界的值来扩展‘symmetric"图像大小通过镜像反射其边界来扩展‘circular"图像大小通过将图像看成是一个二维周期函数的一个周期来扩展size_options‘full"输出图像的大小与被扩展图像的大小相同‘same"输出图像的大小与输入图像的大小相同。这可通过将滤波掩模的中心点的偏移限制到原图像中包含的点来实现,该值为默认值。
2023-07-10 20:44:051

对图象进行求反的matlab程序

好多人回答啊!图像求反两种方法都可以>> g1=imgdjust(f,[0 1],[1 0]); %f为输入图像,此为第一种方法>> g2=imcomplement(f); %f同样为输入图像,此为第二种方法至于邻域均值嘛,主要用 fspecial和imfilter 两个函数,具体可以看一下帮助 ^_^下面的两个例子分别用正方形和圆形的模板进行邻域均值。>> w1=fspecial("average"); %产生一个3x3大小的方形平均滤波模板w1>> g1=imfilter(f,w1,"replicate"); % g1为处理后的图像。"replicate"指卷积填充边缘时用复制边界的值来扩展。 >> w2=fspecial("disk"); %产生一个半径为5的圆形平均滤波模板w2>> g2=imfilter(f,w2,"replicate"); % 同样,g2为处理后的图像,"replicate"指卷积填充边缘时用复制边界的值来扩展。
2023-07-10 20:44:344

这段代码的错误是什么?我是matlab初学者,英文也不太好,看不大懂,希望有人能快点解答,比较着急

lz 你好,是因为这句imshow(wr);,wr为逻辑型数据,imshow不支持,支持uint8,需要转换,修改如下:f=imread("lena(hui).png");subplot(2,2,1)imshow(f);title("(a)原始图像");f=double(f);hv=fspecial("prewitt");hh=hv.";gv=abs(imfilter(f,hv,"replicate"));gh=abs(imfilter(f,hh,"replicate"));g=sqrt(gv.^2+gh.^2);subplot(2,2,2);L=watershed(g);wr=L==0;ww=uint8(wr);%必须把逻辑变量转换为uint8型,imshow才能读取imshow(ww);%title("(b)分水岭");figureL1=uint8(L);%imshow(L1);%
2023-07-10 20:44:412

怎样用MATLAB实现中值和均值滤波

中值滤波楼上答了,5*5的均值滤波代码 w2=fspecial("average",[5 5]); %% 先定义一个滤波器 h=imfilter(a,w2,"replicate"); %%让图像通过滤波器 imshow(h); imwrite(h,"8.jpg"); 均值滤波是I=medfilt2(a,[3 3],"symmetric")可以在matlab中查询medfilt函数的用法,本例是使用3*3的滤波器采用镜像边界法做均值滤波。
2023-07-10 20:45:022

有一个关于matlab的问题。希望大神帮忙解决。

可这样:h= fspecial("sobel"); h1 = h"; g1= imfilter(im, h,"symmetric","same"); g2 = imfilter(im, h1,"symmetric","same"); m=sqrt(double(g1).^2 + double(g2).^2);
2023-07-10 20:45:101

matlab 怎么仿真添加离焦模糊,不同的参数。具体步骤是什么?谢谢各位行家

img=double(img);r=3;%散焦半径rdefocus3=fspecial("disk",r); r=6;%散焦半径rdefocus6=fspecial("disk",r); defocusimg3 = uint8(imfilter(img,defocus3,"conv","circular"));defocusimg6 = uint8(imfilter(img,defocus6,"conv","circular"));
2023-07-10 20:45:332

我想对图像的某个区域(前面已经检测出的)进行低通滤波,matlab如何实现?imfilter 会对整个图片滤波。

有个最笨的方法,也是最容易想到的,就是把图像的其余部分和检测出的部分做差分离,然后单独对分离出的那个区域进行滤波,然后将滤波结果再和剩下的图像的其余部分做和整合起来。。。。。。
2023-07-10 20:45:422

在matlab上,怎么给这个图片加高斯噪声呢,加入的是均值为0、方差0.008的高斯噪声。 实在不会呀。。

clcclear allclose allA = imread("cameraman.tif"); % 读入图像imshow(A);title("原图");V=0.008;Noisy=imnoise(A,‘gaussian",0,V);figure1;imshow(Noisy);%添加均值为0、方差0.008的高斯噪声y_mask = [-1 -1 -1;0 0 0;1 1 1]; % 建立Y方向的模板x_mask = y_mask"; % 建立X方向的模板I = im2double(A); % 将图像数据转化为双精度dx = imfilter(I, x_mask); % 计算X方向的梯度分量dy = imfilter(I, y_mask); % 计算Y方向的梯度分量grad = sqrt(dx.*dx + dy.*dy); % 计算梯度grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 用阈值分割梯度图像figure, imshow(BW); % 显示分割后的图像即边缘图像title("Prewitt")就是这样了。
2023-07-10 20:46:002

这个程序为何总是运行错误。如下:

出现类似情况多是由于系统感染病毒、存在恶意插件、IE组件损害造成的,按照下文所述的方法尝试解决“出现了运行时间错误”的问题,希望对您有所帮助!   出现了运行时间错误的解决办法:  降低IE安全级别,启用ActiveX 控件,关闭脚本调试;  第一步:首先打开IE浏览器,点击上方的“工具”菜单——>选择“Internet选项”——>在常规选项中点击“删除Cookies”——>点击“确定”——>再点击“删除文件”——>勾选“删除所有脱机内容”,点击确定——>不要关闭Internet选项窗口;  第二步:切换到“安全”选项卡中——>点击右下角的“默认级别”——>下拉滑动条,将“安全级别-中”调整为“安全级别-低”——>仍然不要关闭Internet选项窗口;  第三步:切换到“高级”选项卡中——>下拉右边的滑动条,找到“禁用脚本调试(Internet Explorer)”和“禁用脚本调试(其他)”,将这两个项目前面都打上勾——>最后点击“确定”退出Internet选项;  修复IE浏览器必要的组件;  第一步:点击“开始”菜单——>选择“运行”——>在运行中输入“regsvr32 actxprxy.dll”(不含引号),点击确定——>系统提示“actxprxy.dll中的DLLRegisterServer成功”——>点击确定;  第二步:仍然打开“运行”——>在运行中输入“regsvr32 shdocvw.dll”(不含引号),点击确定——>提示“shdocvw.dll中的DLLRegisterServer成功”——>点击确定;  最后,假如上述方法都无法解决“出现了运行时间错误”的问题,可能感染了木马病毒或IE恶意插件,请下载安装杀毒软件或3 60安 全 卫 士,先清除恶意插件,再执行全盘扫描;如果仍然不能解决出现了运行时间错误,请尝试重装 IE浏 览 器。
2023-07-10 20:46:071

MATLAB中用于图像恢复的几个函数的作用及效果,麻烦解释下

PSF=fspecial("motion",40,75)%%%运动模糊算子,有两个参数,表示摄像物体逆时针方向以%%%%%%theta角度运动了len个像素,len的默认值为9,theta的默认值为MF=imfilter(I,PSF,"circular"); %%%图像空域滤波noise=imnoise(zeros(size(I)),"gaussian",0,0.001);%%生成各种噪声图像MFN=imadd(MF,im2uint8(noise));%%运动模糊图像"NSR=sum(noise(:).^2)/sum(MFN(:).^2);imshow(deconvwnr(MFN,PSF,NSR),[])%逆滤波复原"[reg1 LAGRA]=deconvreg(MFN,PSF,NP/3.0);%使用约束最小二乘方滤波复原图像
2023-07-10 20:46:141

matlab高斯滤波自定义函数怎么做

matlab中有自带的高斯滤波函数h=fspecial("gaussian",hsize,sigma),其中hsize是滤波器尺寸,sigma是标准差。若要自己实现的话:functionh=gau_fil(hsize,sigma)siz=(hsize-1)/2;[x,y]=meshgrid(-siz(2):siz(2),-siz(1):siz(1));arg=-(x.*x+y.*y)/(2*sigma*sigma);h=exp(arg);h(h<eps*max(h(:)))=0;sumh=sum(h(:));ifsumh~=0,h=h/sumh;end;end调用时在commandwindow输入:(例如大小为3*3,标准差1)gau_fil([33],1)得到结果:ans=0.07510.12380.07510.12380.20420.12380.07510.12380.0751望采纳,谢谢!
2023-07-10 20:46:214

matlab请指教,关于求图像梯度

你必须将gradmap转换成图像数据,好像是mat2img(gradmap),具体的函数我记不大清楚了,你查查帮助。
2023-07-10 20:46:411

matlab 图像处理出现问题,一幅轮胎图像的缺陷提取 K2(i,j)=K2(i,j)*C;时出现问题,请大家帮忙看看,非常

K3=sum(K2);%%这里,K2为矩阵,楼主的意思应该是求矩阵元素的和吧,那么sum(K2)只是按列求和,如果K2是m*n的矩阵,那么K3=sum(K2)后的大小为1*n,改成K3=sum(sum(K2))即可,下面的代码不用改,即可运行。
2023-07-10 20:46:541

关于图像边缘检测,使用MATLAB程序, 基于Di Zenzo几何测度的彩色图像边缘检测的M函数

f就是你导入的rgb图片。首先按照上面的代码建立一个.m文件,将文件存盘,命名为 colorgrad.m然后在matlab命令窗口输入如下命令:>>f=imread("test.jpg") %这里的test.jpg是图片文件名>> [VG,A,PPT]=colorgrad(f,0)>>figure; imshow(PPT);
2023-07-10 20:47:001

Matlab边缘检测后,求边缘围出的面积及边缘的周长

matlab有很多函数都做好了,拿来用就行了,不是要站在巨人肩膀上吗。。。regionpropsbwperimbwarea没事多翻翻 数字图像处理 Matlab版 的附录,里面把常用的都列出来了,多看看,能节省你很多时间
2023-07-10 20:47:102

MATLAB 程序错误;

由报错信息可知,是deconvblind函数的调用出了问题。在我的Matlab中显示的是第五个参数格式错误,也就是WEIGHT。这好像是控制参数,如果不是很需要,就把它去掉,就可以无出错地运行。改为:[J2 P2] = deconvblind(Blurred,P1,50,[]);
2023-07-10 20:47:192

本人毕业设计做的是基于Retinex算法研究,急需SSR,MSR,Mccann的Matlab仿真代码。要能运行的。

太多了太多了 只贴一个把%Retinex的MSR实现图像增强的代码,可运行,f=imread("c.jpg");fr=f(:, :, 1); fg=f(:, :, 2); fb=f(:, :, 3);%RGB通道mr=mat2gray(im2double(fr)); mg=mat2gray(im2double(fg)); mb=mat2gray(im2double(fb));%数据类型归一化alf1=1458; %定义标准差alf=a^2/2 a=54n=161;%定义模板大小n1=floor((n+1)/2);%计算中心for i=1:n for j=1:n b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*alf1))/(pi*alf1); %高斯函数 endendnr1 = imfilter(mr,b,"conv", "replicate");ng1 = imfilter(mg,b,"conv", "replicate");nb1 = imfilter(mb,b,"conv", "replicate");%卷积滤波ur1=log(nr1); ug1=log(ng1); ub1=log(nb1);tr1=log(mr);tg1=log(mg);tb1=log(mb);yr1=(tr1-ur1)/3;yg1=(tg1-ug1)/3;yb1=(tb1-ub1)/3;alf2=53.38; %定义标准差alf=a^2/2 a=10.3325x=31;%定义模板大小x1=floor((n+1)/2);%计算中心for i=1:n for j=1:n a(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*alf2))/(6*pi*alf2); %高斯函数 endendnr2 = imfilter(mr,a,"conv", "replicate");ng2 = imfilter(mg,a,"conv", "replicate");nb2 = imfilter(mb,a,"conv", "replicate");%卷积滤波ur2=log(nr2); ug2=log(ng2); ub2=log(nb2);tr2=log(mr);tg2=log(mg);tb2=log(mb);yr2=(tr2-ur2)/3;yg2=(tg2-ug2)/3;yb2=(tb2-ub2)/3;alf3=13944.5; %定义标准差alf=a^2/2 a=167l=501;%定义模板大小l1=floor((n+1)/2);%计算中心for i=1:n for j=1:n e(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*alf3))/(4*pi*alf3); %高斯函数 endendnr3 = imfilter(mr,e,"conv", "replicate");ng3 = imfilter(mg,e,"conv", "replicate");nb3 = imfilter(mb,e,"conv", "replicate");%卷积滤波ur3=log(nr3); ug3=log(ng3); ub3=log(nb3);tr3=log(mr);tg3=log(mg);tb3=log(mb);yr3=(tr3-ur3)/3;yg3=(tg3-ug3)/3;yb3=(tb3-ub3)/3;dr=yr1+yr2+yr3;dg=yg1+yg2+yg3;db=yb1+yb2+yb3;cr=im2uint8(dr); cg=im2uint8(dg); cb=im2uint8(db);z=cat(3, cr, cg, cb); figure, imshow(z)
2023-07-10 20:47:282

怎么在MATLAB中计数二值图像中目标物八邻域值为某一值的个数

是这样abs(imfilter(pUnImage,[-1 0 0;0 1 0;0 0 0]))abs(imfilter(pUnImage,[0 -1 0;0 1 0;0 0 0])).abs(imfilter(pUnImage,[0 0 -1;0 1 0;0 0 0])).abs(imfilter(pUnImage,[0 0 0;-1 1 0;0 0 0])).abs(imfilter(pUnImage,[0 0 0;0 1 -1;0 0 0])).abs(imfilter(pUnImage,[0 0 0;0 1 0;-1 0 0])).abs(imfilter(pUnImage,[0 0 0;0 1 0;0 -1 0])).abs(imfilter(pUnImage,[0 0 0;0 1 0;0 0 -1])).
2023-07-10 20:47:372

matlab图像锐化

%%%目测你的是拉普拉斯算子 下面的程序也是一样的 你试试 图片改成你的图片A=imread("lena.bmp"); figure(1);subplot(1,2,1);imshow(A);title("原图");I=double(A);h=[-1 -1 -1;-1 9 -1;-1 -1 -1];J=conv2(I,h,"same");K=uint8(J);subplot(1,2,2);imshow(K);title("使用拉普拉斯算子锐化处理后的图");
2023-07-10 20:47:511

matlab 常用的图像消噪函数有哪些

第一步去椒盐噪声,第二部去高斯噪声,可以使用imfilter函数。 用中值滤波去除椒盐噪声,维纳滤波去除高斯噪声。 代码网上特别多,请自行搜索,我觉得这样对你更有好处。
2023-07-10 20:47:571

matlab拉普拉斯滤波器程序

function projectdemo(n,m,p)if mod(n,floor(n))~=0 | n<=2 | mod(n,2)==0 error("n必须是大于等于3的奇数整数");endif mod(m,floor(m))~=0 | m<=2 | mod(m,2)==0 error("m必须是大于等于3的奇数整数");endif mod(p,floor(p))~=0 | p<=2 | mod(p,2)==0 error("p必须是大于等于3的奇数整数");endcenter1=-((n^2)-1);lapmask1=ones(n);lapmask1((n+1)/2,(n+1)/2)=center1; center2=-((m^2)-1);lapmask2=ones(m);lapmask2((m+1)/2,(m+1)/2)=center2; center3=-((p^2)-1);lapmask3=ones(p);lapmask3((p+1)/2,(p+1)/2)=center3;fin=im2double(imread("moon.tif"));gout1=fin-imfilter(fin,lapmask1,"replicate");gout2=fin-imfilter(fin,lapmask2,"replicate");gout3=fin-imfilter(fin,lapmask3,"replicate"); S0=char("*");S1=num2str(n);S2=char("滤波图像");S=strcat(S1,S0,S1,S2); subplot(2,2,1);imshow(fin);axis ontitle("原始图像","FontSize",14,"FontName","隶书","color","b");subplot(2,2,2);imshow(gout1);axis ontitle("3*3滤波","FontSize",14,"FontName","隶书","color","b");subplot(2,2,3);imshow(gout2);axis ontitle("5*5滤波","FontSize",14,"FontName","隶书","color","b");subplot(2,2,4);imshow(gout3);axis ontitle("7*7滤波","FontSize",14,"FontName","隶书","color","b");
2023-07-10 20:48:151

matlab数字图象处理

模板越大,图像越模糊h5=ones(5,5)/25;h7=ones(7,7)/49j=imfilter(I,h5)
2023-07-10 20:48:221

在matlab中fspecial是什么意思

创建一个二维的滤波器。图像处理中,创建好后可以使用函数imfilter调用这个滤波器,对某个图像做滤波操作,如高斯模糊。
2023-07-10 20:48:291

帮帮我 我不知道分水岭算法在图像分割中的应用…… 代码,还有别的帮帮我

clear,clc%三种方法进行分水岭分割%读入图像filename="sar1.bmp";f=imread(filename);Info=imfinfo(filename);if Info.BitDepth>8 f=rgb2gray(f);endfigure,mesh(double(f));%显示图像,类似集水盆地%方法1:一般分水岭分割,从结果可以看出存在过分割问题b=im2bw(f,graythresh(f));%二值化,注意应保证集水盆地的值较低(为0),否则就要对b取反d=bwdist(b); %求零值到最近非零值的距离,即集水盆地到分水岭的距离 l=watershed(-d); %matlab自带分水岭算法,l中的零值即为风水岭w=l==0; %取出边缘g=b&~w; %用w作为mask从二值图像中取值figuresubplot(2,3,1),imshow(f);subplot(2,3,2),imshow(b);subplot(2,3,3),imshow(d);subplot(2,3,4),imshow(l);subplot(2,3,5),imshow(w);subplot(2,3,6),imshow(g);%方法2:使用梯度的两次分水岭分割,从结果可以看出还存在过分割问题(在方法1的基础上改进)h=fspecial("sobel");%获得纵方向的sobel算子fd=double(f);g=sqrt(imfilter(fd,h,"replicate").^2+imfilter(fd,h","replicate").^2);%使用sobel算子进行梯度运算l=watershed(g);%分水岭运算wr=l==0; g2=imclose(imopen(g,ones(3,3)),ones(3,3));%进行开闭运算对图像进行平滑l2=watershed(g2);%再次进行分水岭运算wr2=l2==0;f2=f;f2(wr2)=255;figuresubplot(2,3,1),imshow(f);subplot(2,3,2),imshow(g);subplot(2,3,3),imshow(l);subplot(2,3,4),imshow(g2);subplot(2,3,5),imshow(l2);subplot(2,3,6),imshow(f2);%方法3:使用梯度加掩模的三次分水岭算法(在方法2的基础上改进)h=fspecial("sobel");%获得纵方向的sobel算子fd=double(f);g=sqrt(imfilter(fd,h,"replicate").^2+imfilter(fd,h","replicate").^2);%使用sobel算子进行梯度运算l=watershed(g);%分水岭运算wr=l==0; rm=imregionalmin(g); %计算图像的区域最小值定位,该函数仅仅是用来观察为何分水岭算法产生这么多集水盆地im=imextendedmin(f,2);%上面仅是产生最小值点,而该函数则是得到最小值附近的区域,此处的附近是相差2的区域fim=f; fim(im)=175; %将im在原图上标识出,用以观察 lim=watershed(bwdist(im));%再次分水岭计算em=lim==0;g2=imimposemin(g,im|em);%在梯度图上标出im和em,im是集水盆地的中心,em是分水岭l2=watershed(g2); %第三次分水岭计算f2=f;f2(l2==0)=255; %从原图对分水岭进行观察figuresubplot(3,3,1),imshow(f);subplot(3,3,2),imshow(g);subplot(3,3,3),imshow(l);subplot(3,3,4),imshow(im);subplot(3,3,5),imshow(fim);subplot(3,3,6),imshow(lim);subplot(3,3,7),imshow(g2);subplot(3,3,8),imshow(l2)subplot(3,3,9),imshow(f2);
2023-07-10 20:48:361

(1) 选择一幅图像,叠加零均值高斯噪声,然后分别利用领域平均法和中值滤波法对该图像进行滤波,显示滤

领域法:y=imread("D:ABC.jpg");J1=imnoise(y,"salt & pepper",0.02);J2=imnoise(y,"gaussian");H1=ones(3,3)/9;Y=imfilter(y,H1);Y1=imfilter(J1,H1);Y2=imfilter(J2,H1);subplot(2,2,1),imshow(Y);subplot(2,2,2),imshow(Y1);subplot(2,2,3),imshow(Y2);中值法y=imread("D:ABC.jpg");J1=imnoise(y,"salt & pepper",0.02);J2=imnoise(y,"gaussian",0.02);subplot(2,2,1),imshow(J1);subplot(2,2,2),imshow(J2);y1=medfilt2(J1,[5,5]);y2=medfilt2(J2,[5,5]);subplot(2,2,3),imshow(y1);subplot(2,2,4),imshow(y2);
2023-07-10 20:48:452

谁知道ENVI里面图像增强中(Enhance)高斯增强是什么原理,文档或者链接都行啊

高斯滤波(高斯平滑)是图像处理,计算机视觉里面最常见的操作。平时,我们都是用matlab或者opencv的函数调用:imfilter或者cvSmooth,并不关心底层的实现。然而当开发者要实做高斯滤波的时候,往往就会很迷惘,往往会被以下几个问题困扰:给定sigma,即标准偏差,怎么确定离散化后滤波器的窗口大小?给定窗口大小,怎么计算高斯核的sigma,即标准方差?怎么实现可分离滤波器?我在google上搜了一下,还真没几个人把实现的细节讲清楚了。这里,我尝试结合三份源码,做个小小的总结。三份源码分别是:opencv中的cvfilter.cppautopano-sift-c中的GaussianConvolution.cGIMP中的blur-gauss.c和unsharp-mask.c在图像处理中,高斯滤波一般有两种实现方式,一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。最常见的就是第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅里叶变化的实现方法。这里我们只讨论第一种方法。二维高斯函数的形式是这样的:f(x,y) = A e^{- left(frac{(x-x_o)^2}{2sigma_x^2} + frac{(y-y_o)^2}{2sigma_y^2} ight)}.有着如下的形状,形状很激凸,怎么会叫高斯平滑呢,分明是高斯激凸嘛:基本上,离散化的主旨就是保留高斯函数中心能量最集中的中间部分,忽略四周能量很小的平坦区域。这只是个很感性的描述,具体实现起来,就会出现千奇百怪的版本。下面结合三份源码,看看现实世界里的高斯平滑到底长的什么样子。首先是第一个问题:给定sigma,怎么计算窗口大小?直接上opencv的源码,在cvFilter函数中:param1 = cvRound(sigma1*(depth == CV_8U ? 3 : 4)*2 + 1)|1;opencv认为半径为3*sigma的窗口就是高斯函数能量最集中的区域。(为什么在图像深度不是8U的时候,使用4*sigma半径的窗口就不得而知了,有高人指点一下?)autopan0-sift-c是图像拼接软件hugin里面的sift实现,在实现DoG的时候需要做不同尺度的高斯平滑,实现如下,在GaussianConvolution_new1函数中:dim = 1 + 2 * ((int) (3.0 * sigma));可见autopano也是实现的3*sigma半径的窗口。在GIMP里,实现比较奇特,在blur_gauss.c的make_rle_curve函数里面,const gdouble sigma2 = 2 * sigma * sigma;const gdouble l = sqrt (-sigma2 * log (1.0 / 255.0));int n = ceil (l) * 2;if ((n % 2) == 0)n += 1;我是没看懂那个 log (1.0 / 255.0)是干嘛的。。。惭愧。效果来看,这个实现的窗口半径是约等于2.2*sigma。然后是第二个问题:给定窗口大小,怎么计算sigma?opencv的实现,在cvFilter.cpp的init_gaussian_kernel函数中:sigmaX = sigma > 0 ? sigma : (n/2 – 1)*0.3 + 0.8;再次不可解。。。乘以0.3还可以接受,加上0.8是为嘛啊?autopano没有实现这个特性。GIMP的实现:/* we want to generate a matrix that goes out a certain radius* from the center, so we have to go out ceil(rad-0.5) pixels,* inlcuding the center pixel. Of course, that"s only in one direction,* so we have to go the same amount in the other direction, but not count* the center pixel again. So we double the previous result and subtract* one.* The radius parameter that is passed to this function is used as* the standard deviation, and the radius of effect is the* standard deviation * 2. It"s a little confusing.*/radius = fabs (radius) + 1.0;std_dev = radius;radius = std_dev * 2;/* go out ‘radius" in each direction */matrix_length = 2 * ceil (radius – 0.5) + 1;注释讲的很清楚了,基本上就是认为sigma应该等于窗口半径的一半。看完这三分源码,结论就是,关于sigma和半径,你爱怎么算就怎么算吧,差不多就行。。。(额。。费了半天劲,就得到这么一句废话啊)。第三个问题是可分离滤波器:由于高斯函数可以写成可分离的形式,因此可以采用可分离滤波器实现来加速。所谓的可分离滤波器,就是可以把多维的卷积化成多个一维卷积。具体到二维的高斯滤波,就是指先对行做一维卷积,再对列做一维卷积。这样就可以将计算复杂度从O(M*M*N*N)降到O(2*M*M*N),M,N分别是图像和滤波器的窗口大小。问题是实现时候怎么计算一维的卷积核呢?其实很简单,按照前面计算出来的窗口大小,计算所有离散点上一维高斯函数的权值,最后别忘了将权值之和归一化到1.有码有真相,来自opencv:for( i = 0; i <= n/2; i++ ){double t = fixed_kernel ? (double)fixed_kernel[i] : exp(scale2X*i*i);if( type == CV_32FC1 ){cf[(n/2+i)*step] = (float)t;sum += cf[(n/2+i)*step]*2;}else{cd[(n/2+i)*step] = t;sum += cd[(n/2+i)*step]*2;}}sum = 1./sum;for( i = 0; i <= n/2; i++ ){if( type == CV_32FC1 )cf[(n/2+i)*step] = cf[(n/2-i)*step] = (float)(cf[(n/2+i)*step]*sum);elsecd[(n/2+i)*step] = cd[(n/2-i)*step] = cd[(n/2+i)*step]*sum;}
2023-07-10 20:48:542

setcharacterencodingfilter.java 怎么用

在web.xml里面配置吧?<filter> <filter-name>imFilter</filter-name> <filter-class>com.sinovatech.filter.ImFilter</filter-class></filter><filter-mapping> <filter-name>imFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>过滤器一般都这么 配置不过你这个可能要加个initparam 传编码值的
2023-07-10 20:49:031

imfilter函数的介绍

imfilter函数叫做实现线性空间滤波函数。功能:对任意类型数组或多维图像进行滤波。
2023-07-10 20:49:411

请教关于matlab中imfilter函数的使用

请教关于matlab中imfilter函数的使用功能:对任意类型数组或多维图像进行滤波。用法:B = imfilter(A,H)B = imfilter(A,H,option1,option2,...)或写作g = imfilter(f, w, filtering_mode, boundary_options, size_options)
2023-07-10 20:49:491

matlab filter2和imfilter有什么区别啊

两个函数结果类型不一样,只需要在I1=filter2(h,I)后面加上I1=uint8(I1)进行类型转换,结果就是一样的。
2023-07-10 20:49:552

SRCNN的卷积运算的代码,有没有大神懂,

基于卷积神经网络... 博文 来自: wangxujin666的博客 1.SRCNN(原理和代码)基于TensorFlow的代码下载:https://github.com/tegg8
2023-07-10 20:50:041

matlab调用自写函数问题

MATLAB 调用自己写的函数要function 而且要函数名与.m文件名相同 然后再命令窗口用函数名调用
2023-07-10 20:50:111

MATLAB软件处理图像复原的问题?

f=checkerboard(8);%读图像PSF=fspecial("gaussian",7,10);%高斯核SD=0.01;%噪声标准差g=imnoise(imfilter(f,PSF),"gaussian",0,SD^2);%图像中加入模糊核噪声subplot(3,2,1);%三子图第一张imshow(f),title("(a)");%画原图subplot(3,2,2);%三子图第二张imshow(g),title("(b)");%画降质图像DAMPAR=10*SD;%去模糊参数LIM=ceil(size(PSF,1)/2);%坐标缩影WEIGHT=zeros(size(g));%去模糊权重初始化WEIGHT(LIM+1:end-LIM,LIM+1:end-LIM)=1;%去模糊权重赋值NUMIT=5;%迭代次数f5=deconvlucy(g,PSF,NUMIT,DAMPAR,WEIGHT);%去模糊subplot(3,2,3);%三子图第三张imshow(f5),title("(c)");%画复原图像
2023-07-10 20:50:171

谁有spfilt和intrans函数的M文件

function f = spfilt(g, type, m, n, parameter) % % f = spfilt(g, "amean", m, n) 算术平均 % f = spfilt(g, "gmean", m, n) 几何平均 % f = spfilt(g, "hmean", m, n) 谐函数平均 % f = spfilt(g, "chmean", m, n,Q) contraharmonic 平均 % f = spfilt(g, "median", m, n) 中值 % f = spfilt(g, "max", m, n) 最大值 % f = spfilt(g, "min", m, n) 最小值 % f = spfilt(g, "midpoint", m, n) 中点 % f = spfilt(g, "atrimmed", m, n,D) alpha-trimmed 平均 % if nargin == 2 m = 3; n = 3; Q = 1.5; d = 2; elseif nargin == 5 Q = parameter; d = parameter; elseif nargin == 4 Q = 1.5; d = 2; else error("Wrong number of inputs."); end switch type case "amean" w = fspecial("average",[m,n]); f = imfilter(g,w,"replicate"); case "gmean" f = gmean(g,m,n); case "hmean" f = harmean(g,m,n); case "chmean" f = charmean(g,m,n,Q); case "median" f = medfilt2(g, [m,n], "symmetric"); case "max" f = ordfilt2(g,m*n,ones(m,n),"symmetric"); case "min" f = ordfilt2(g,1,ones(m,n),"symmetric"); case "midpoint" f1 = ordfilt2(g,1,ones(m,n),"symmetric"); f2 = ordfilt2(g,m*n,ones(m,n),"symmetric"); f = imlincomb(0.5,f1,0.5,f2); case "atrimmed" if (d<0) | (d/2~=round(d/2)) error("d must be a nonnegative, even integer.") end f = alphatrim(g,m,n,d); otherwise error("Unknown filter type.") end
2023-07-10 20:50:241

matlab运行中出现如下问题,这是什么原因?好像是函数有问题

help fspecial FSPECIAL Create predefined 2-D filters. H = FSPECIAL(TYPE) creates a two-dimensional filter H of the specified type. Possible values for TYPE are: "average" averaging filter "disk" circular averaging filter "gaussian" Gaussian lowpass filter "laplacian" filter approximating the 2-D Laplacian operator "log" Laplacian of Gaussian filter "motion" motion filter "prewitt" Prewitt horizontal edge-emphasizing filter "sobel" Sobel horizontal edge-emphasizing filter "unsharp" unsharp contrast enhancement filter Depending on TYPE, FSPECIAL may take additional parameters which you can supply. These parameters all have default values. H = FSPECIAL("average",HSIZE) returns an averaging filter H of size HSIZE. HSIZE can be a vector specifying the number of rows and columns in H or a scalar, in which case H is a square matrix. The default HSIZE is [3 3]. H = FSPECIAL("disk",RADIUS) returns a circular averaging filter (pillbox) within the square matrix of side 2*RADIUS+1. The default RADIUS is 5.img_smoothed=imfilter(img_noise,fspecial("averge,5"));这句错了 改成img_smoothed=imfilter(img_noise,fspecial("averge",5)); 试一下
2023-07-10 20:50:332

求超分辨率图像重建的MATLAB代码或者软件

function Output = denoiseByTv(Ima, Thr) ImaTv = imfilter(Ima, "Laplacian");ImaTh = (ImaTv< Thr)*ImaTv;output = Ima - ImaTh;end
2023-07-10 20:50:401

matlab高斯滤波 运行不了了。。。求高手

filter2改成imfilter
2023-07-10 20:50:581

如何计算两幅灰度图像之间的误差

可以啊,这是matlab的一个例程,读取的图片就是灰度图像,运行没问题ref = imread("pout.tif");H = fspecial("Gaussian",[11 11],1.5);A = imfilter(ref,H,"replicate");subplot(1,2,1); imshow(ref); title("Reference Image");subplot(1,2,2); imshow(A); title("Blurred Image");[ssimval, ssimmap] = ssim(A,ref);fprintf("The ssim value is %0.4f. ",ssimval);figure, imshow(ssimmap,[]);title(sprintf("ssim Index Map - Mean ssim Value is %0.4f",ssimval));
2023-07-10 20:52:321

matlab图像处理问题

I=imread("psb.jpg");PSF=fspecial("gaussian",7,10); %产生一个高斯低通滤波器V=.01; %高斯加性噪声的标准差IF1=imfilter(I,PSF);BlurredNoisy=imnoise(IF1,... "gaussian",0,V); %原图像通过高斯低通滤波器后,加入高斯噪声 NoisePower=V*numel(I); %计算噪声的功率[J, LAGRA]=deconvreg(BlurredNoisy,PSF,NoisePower); %subplot(221);imshow(BlurredNoisy);title("A=Blurred and Noisy");我运行没有问题,你检查一下图片的路径对不对。然后看反馈的错误信息。或者在其他的电脑上试试。
2023-07-10 20:52:412

求梯度分布直方图matlab代码

function H=HOG(Im)nwin_x=3;%set here the number of HOG windows per bound boxnwin_y=3;B=9;%set here the number of histogram bins[L,C]=size(Im); % L num of lines ; C num of columnsH=zeros(nwin_x*nwin_y*B,1); % column vector with zerosm=sqrt(L/2);if C==1 % if num of columns==1 Im=im_recover(Im,m,2*m);%verify the size of image, e.g. 25x50 L=2*m; C=m;endIm=double(Im);step_x=floor(C/(nwin_x+1));step_y=floor(L/(nwin_y+1));cont=0;hx = [-1,0,1]; %水平梯度模板hy = -hx";%垂直梯度模板grad_xr = imfilter(double(Im),hx);%水平梯度grad_yu = imfilter(double(Im),hy);%垂直梯度angles=atan2(grad_yu,grad_xr);%梯度角度magnit=((grad_yu.^2)+(grad_xr.^2)).^.5;%梯度大小for n=0:nwin_y-1 for m=0:nwin_x-1 cont=cont+1; angles2=angles(n*step_y+1:(n+2)*step_y,m*step_x+1:(m+2)*step_x); magnit2=magnit(n*step_y+1:(n+2)*step_y,m*step_x+1:(m+2)*step_x); v_angles=angles2(:); v_magnit=magnit2(:); K=max(size(v_angles)); %assembling the histogram with 9 bins (range of 20 degrees per bin) bin=0; H2=zeros(B,1); for ang_lim=-pi+2*pi/B:2*pi/B:pi bin=bin+1; for k=1:K if v_angles(k)<ang_lim v_angles(k)=100; H2(bin)=H2(bin)+v_magnit(k); end end end H2=H2/(norm(H2)+0.01); H((cont-1)*B+1:cont*B,1)=H2; endend
2023-07-10 20:52:471

matlab中deconvwnr函数是什么

  函数是用PSF即点分布函数来修复图形的。  MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
2023-07-10 20:52:574

matlab filter2()函数怎么用

解决办法如下所示:y = filter(b,a,X),[y,zf] = filter(b,a,X),[y,zf] = filter(b,a,X,zi),y = filter(b,a,X,zi,dim),[...] = filter(b,a,X,[],dim)。扩展资料:一、Filter新增加的功能包括:1、新的国际化。2、应用程序生命周期事件控制。3、澄清了类的装载规则。4、新的错误及安全属性。5、不赞成使用HttpUtils 类。6、各种有用的方法。二、一个filter必须实现javax.servlet.Filter的三个方法:1. void setFilterConfig(FilterConfig config) //设置filter 的配置对象。2. FilterConfig getFilterConfig() //返回filter的配置对象。3. void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) //执行filter 的工作。参考资料来源:百度百科-Filter
2023-07-10 20:53:054

MATLAB 语句解释 tmpx=Ix(i:i+step-1,j:j+step-1);

你这个是对的,第i个元素是不是该列的最大值,如果是,会返回1,不是的话,返回0.其实你不用这么做,你可以直接用find函数。找到最大的元素的位置。i = find(tmp(:,j) == max(tmp(:.j))), i就是这一列里面最大数的编号。
2023-07-10 20:53:381

MATLAB GUI 设计数字图像处理软件包括以下内容: 1,图像的读入 2 图像格式的转换包括jpg,bmp,gif等

近期正在做这个,给楼主一半代码,另一半不怎么懂图像读入[filename,pathname]=uigetfile({"*.jpg";"*.bmp";"*.tif";"*.*"},"载入图像");if isequal(filename,0)|isequal(pathname,0) errordlg("没有选中文件","出错"); return;else file=[pathname,filename]; x=imread(file); set(handles.axes1,"HandleVisibility","ON"); axes(handles.axes1); imshow(x); set(handles.axes1,"HandleVisibility","OFF"); axes(handles.axes2); imshow(x); handles.img=x; guidata(hObject,handles);end图像增强(不知道楼主要几个增强)直方图均衡化global Taxes(handles.axes2);T=getimage;h=histeq(handles.img); imshow(h);handles.img=h;guidata(hObject,handles); 频域滤波axes(handles.axes2);y1=handles.img; f=double(y1); % 数据类型转换,matlab不支持图像的无符号整型的计算g=fft2(f); % 傅里叶变换g=fftshift(g); % 转换数据矩阵[M,N]=size(g);nn=2; %二阶巴特沃斯低通滤波器d0=50; %截止频率50m=fix(M/2); n=fix(N/2);for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2); h=1/(1+0.414*(d/d0)^(2*nn)); % 计算低通滤波器传递函数 result(i,j)=h*g(i,j); endendresult=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3); % 显示处理后的图像锐化可以使用拉普拉斯算子进行锐化,具体可以使用fspecial函数与imfilter函数灰度化 global Taxes(handles.axes2);T=getimage;x=rgb2gray(handles.img); imshow(x);handles.img=x;guidata(hObject,handles);楼主先给几分呗,还有几份资料关于gui的一起发你邮箱
2023-07-10 20:53:472

MATLAB 局部图像处理

很简单的, 因为你的图中的圆不是标准的规范的圆, 用圆的方程之类的方法话边框反而不好, 直接遍历图像中所有像素, 如果相邻像素的像素值相差超过了一定的阈值(自己试一下, 我感觉至少有50以上), 就把这个点标记成红色. 以后处理的时候判断一下当前经过的红色点的个数, 偶数个肯定是圆框外的部分, 奇数个就在圆框内的部分. 比如说我现在遍历到了图像的第二行, 一开始我没有遇到红色点, 红色像素点个数累积为0. 这时就不用做图像处理, 等到遇到了第一个红色像素, 这时我们就进入了图中第一个圆的区域中, 然后开始做处理, 下次遇到红色点就表示离开了圆形区域. 后面的同样道理
2023-07-10 20:53:573

MATLAB中怎么产生任意奇数尺寸拉普拉斯滤波器,写一个M文件函数

以一幅uint8类灰度图像为例,原图:直接使用laplacian滤波模板滤波:>> f=imread("moon.tif");>> w=fspecial("laplacian",0)>> g1=imfilter(f,w,"replicate");>> imshow(g1)效果并不理想,因为原图是一幅uint8类图像,输出结果仍为uint8类,所有像素均为正值,而拉普拉斯滤波模板中存在负值,变换结果中的所有负值被截掉了。解决此问题,须先进行类型变换:f2=im2double(f); %将f转换为归一化的double类图像然后再进行滤波:>> g2=imfilter(f2,w,"replicate");>> imshow(g2,[])
2023-07-10 20:54:231