首页 > 编程知识 正文

matlab维纳滤波器(matlab中tofloat)

时间:2023-05-06 04:07:22 阅读:65178 作者:1503

用目录过滤器(像素过滤器)语法实现imfilter非线性过滤器colfiltpadarray实例

线性滤波(过滤为像素)

线性运算包括将附近每个像素的系数相乘,并将结果相加,以获得点(x,y )处的响应。 如果附近的大小为mxn,则合计需要mn个系数。 这些系数排列在称为过滤器、蒙版、过滤器蒙版、核心、模板或窗口的矩阵中,前三个术语是最常见的。 为了方便,也经常使用卷积滤波器、口罩、磁芯等术语。

在每个点(x,y )处,滤波器在该点处的响应是由滤波器掩码定义的对应相邻像素与滤波器系数之积的结果的累积。

所有假设都基于口罩大小应为奇数的原则,有意义的口罩最小尺寸为3 x 3。 虽然不是必需条件,但处理奇数大小的蒙版会更直观,因为只有一个中心点。

实际线性滤波使用这两个容易混淆的概念

相关的

口罩w如上图所示在图像f中移动的过程。

折叠起来

技术上,卷积是相同的过程,并且在图像f中移动w之前只需要将w旋转180度。

语法实现imfilterg=imfilter(f,w,filtering_ mode,boundary_ options, size_options ) %f是输图像,w是过滤器蒙版,g是过滤器%boundary_ options由过滤器的大小决定。 %size_options将为' same '

过滤器类型

选项说明“颜色”过滤使用相关性进行。 此值是使用卷积完成边界选项的默认“‘conv”过滤器

可选描述p输入图像的边界通过用值p (无引号)填充来扩展。 的默认值为0“复制”图像大小。 通过复制外部边界的值来扩展“系统”图像大小,并通过镜像反射该边界来扩展“核心”图像大小。 通过将图像视为二维周期函数的一个周期来扩展大小选项

选项表示" " ‘full "输出图像的大小和扩展图像的大小相同" " ‘same "输出图像的大小和输入图像的大小相同。 这能够通过将滤波器掩模的中心点的偏差限制为原图像中包含的点来实现。 该值为默认值A=[1 0; 0 ); b=ones (256,256 ); c=Kron(a,b ); 得到512*512的图像subplot(121 ) imshow(C ) c )原图subplot(121 ) w=ones (31,31 ); %平均滤波器GD=im滤波器(c,w ); imshow(GD,[] )。

与原始图像相比,可以看到滤镜后有模糊效果。 由于没有设置边界条件,因此默认情况下用黑色填充边界。

选择边界条件看看效果吧

A=[1 0; 0 ); b=ones (256,256 ); c=Kron(a,b ); 得到512*512的图像subplot(221 ) imshow(C ) c (原图subplot ) 222 (w=ones ) 31,31 ); gr=imfilter(c,w,'复制' ); imshow(gr,[] ) subplot ) 223 ) gs=imfilter(C ) c、w、' symmetric ' ); imshow(GS,[] ) subplot ) 224 ) gc=imfilter(C ) c,w,' circular ' ); imshow(GC,[] )下图显示了原始图和选择三种边界条件后的结果图

复制和系统取得了很好的效果,但circular问题与零填充问题相同。 因为周期性使用可以使图像的暗部分接近明亮的区域。

如果图像是uint8型会怎么样呢

f8=im2uint8(c; gr8=im过滤器(F8,w,' replicate ' ); imshow(gr8,[] )。

从图中很容易看出数据丢失了。 实际上进行正规化处理。

“非线性过滤工具箱”提供了两个执行常规非线性过滤的函数:函数nlfilter和函数colfilt。

函数nlfilter直接执行二维操作函数colfilt将数据组织为列。 虽然需要消耗更多的内存,但运行速度比nlfilter快得多。 当执行正常非线性空间滤波时,经常使用colfilt而不是nlfllter。 给定mn大小的图像f和mn大小的邻域,函数colfilt生成最大大小为MnMn的矩阵a。 在此矩阵中,每一列对应于图像中位于某个位置且位于中心附近的像素。

colfiltg=colfilt(f、[m n]、' sliding '、@fun、parameters ) %m和n也是过滤区域的维数%'sliding ',处理过程在输图像f中对每个像素都是该m x n区域

parameters表示函数fun可能需要的参数(由逗号分隔开)%符号@称为函数句柄,它是一种MATLAB数据类型,它包含有引用函数用到的一些信息

而实际上在对图像滤波之前,要进行输入前图像的填充,使用padarray

padarray

对于二维函数,它的语法为

fp = padarray(f, [r c],method, direction)% f为输入图像% fp为填充后的图像% [r c]用于给出填充f的行数和列数

函数padarray的选项
method

选项描述‘symnetric’图像大小通过围绕边界进行镜像反射来扩展‘replicate’图像大小通过复制外边界中的值来扩展‘circular’图像大小通过将图像看成是一个二维周期函数的一个周期来进行扩展

direction

选项描述‘pre’在每一维的第一个元素前填充‘post’在每一维的最后一个元素后填充‘both’在每一维的第一个元素前和最后一个元素后填充。此选项为默认值

举个例子:

f = [1 2; 3 4];fp = padarray(f, [3 2], 'replicate', 'post' )

输出如下:

若参量中不包括direct ion,则默认值为’both’。若参量中不包含method,则默认用零来填充。
若参量中不包括任何参数,则默认填充为零且默认方向为’both’。
在计算结束时,图像会被修剪为原始大小。

实例

使用两者结合来执行一个非线性滤波,该非线性滤波在任何点处的响应都是中心在该点的邻城内的像素亮度值的几何平均。大小为mxn的邻域中的几何平均是邻域内亮度值的乘积的1/mm次幂。我们首先执行非线性滤波函数

调用gmean function v = gmean (A)mn = size(A, 1);%各The length of the columns of A is always mn.V = prod(A, 1) .^ (1/mn) ; 滤波 f = padarray(f, [m n],' replicate') ;g = colfilt(f, [m n], 'sliding', @gmean) ;

或者

f = [1 2; 3 4];m = 3;n = 2;h = @(A) prod(A, 1).^(1/size(A, 1));f = padarray(f, [m n],'replicate') ;g = colfilt(f, [m n], 'sliding', h)

得到输出为:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。