matlab做gaussian高斯滤波

原文链接:https://blog.csdn.net/humanking7/article/details/46826105

 

 

核心提示
在Matlab中高斯滤波非常方便,主要涉及到下面两个函数:

函数: fspecial
函数: imfilter
 

代码实现
 
clear all;
clc;
%----------------------------------------------
%对图像进行高斯滤波,并显示图像
%----------------------------------------------
%读进图像
[filename, pathname] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'; '*.png' }, '选择图片');
%没有图像
if filename == 0
    return;
end
Image = imread([pathname, filename]);
[m, n, z] = size(Image);
%转换为灰度图
if z>1
    Image = rgb2gray(Image);
end
sigma = 1;
gausFilter = fspecial('gaussian', [5,5], sigma);
gaus= imfilter(Image, gausFilter, 'replicate');

%显示图像-----------------------
 figure(1)
  subplot(1,2,1);
    imshow(Image);
    title('原图像');
 subplot(1,2,2);
    imshow(gaus);
     title('滤波后');
 
 
效果展示
————————————————
版权声明:本文为CSDN博主「祥知道」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/humanking7/article/details/46826105

 

来源:https://www.cnblogs.com/miki-52/p/5289062.html   待验证

Gauss滤波快速实现方法(转)

  二维高斯函数具有旋转对称性,处理后不会对哪一个方向上的边缘进行了过多的滤波,因此相对其他滤波器,具有无法比拟的优越性。但是传统Gauss滤波随着图像尺寸的增加,运算复杂度呈平方上涨,因此需要对其优化改进。下面,分别介绍传统型,分解型和递归迭代型三种实现方法。

  

1 传统型

  Gauss滤波首先需要构建一个Gauss滤波核,公式为:

Matlab实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dSigma =0.8;
fK1=1.0/(2*dSigma*dSigma);
fK2=fK1/pi;
iSize = 5;
step = floor(iSize/2 + 0.5);
for i = 1 : iSize
    x=i-step;
    fTemp=fK2*exp(-x*x*fK1);
    for j = 1 : iSize
        y=j-step;
        model(x+step,y+step)=fTemp*exp(-y*y*fK1);
    end
end
dSum = sum(sum(model));
model = model/dSum;                     %Gauss核数值归一化

  

  

图1 Gauss滤波核(5*5大小)

  接下来就是将输入图像和滤波核进行卷积操作。其实质就是对原始图像进行加权求和,把这个“和”赋给中心像素。对于一个2048*2048的图像,需要进行104734756次乘法运算,和104734756次加法运算,运算复杂度是很高的。

2 分解型

  

  我们可以把一个二维Gauss核分解为两个一维高斯核,然后先对行做一次一维卷积,再对这个卷积结果做一次一维列卷积,得到的结果完全一模一样,而开销会小很多。

一维高斯核函数:

  Matlab代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
dSigma =0.8;
fK1=1.0/(2*dSigma*dSigma);
fK2=fK1/pi;
iSize = 5;
step = floor(iSize/2 + 0.5);
for i = 1 : iSize
    x=i-step;
    fTemp=fK2*exp(-x*x*fK1);
    model(1,x+step) = fTemp;
end
dM = sum(model);
model = model / dM;

  

图2 一维高斯滤波核(1*5大小)

  一维卷积原理和二维卷积一样,只不过我们只需要将同一行或同一列上的数据,按位置一一加权求和,再把“和”赋给中心元素。

  对于一个2048*2048的图像,需要进行41918464次乘法运算,和41918464次加法运算。相比传统运算量,只是前者的1/2.4985。如果遇到频繁计算Gauss滤波的算法,后者明显比前者速度快很多。

3 递归迭代型

  第二种方法较第一种方法,虽然有了较大改善,但是任然复杂度较高。这里再介绍一种更快速的逼近Gauss滤波方法。

     具体步骤分为两步:首先对图像做一次前向滤波,其次,对图像再做一次后向滤波。

  Forward:

  Backward:

1
2
3
4
5
6
7
8
9
10
11
12
13
qFactor = 5;
b0Coeff = 1.57825 + (2.44413 * qFactor) + (1.4281 * qFactor * qFactor) + (0.422205 * qFactor * qFactor * qFactor);
b1Coeff = (2.44413 * qFactor) + (2.85619 * qFactor * qFactor) + (1.26661 * qFactor * qFactor * qFactor);
b2Coeff = (-1.4281 * qFactor * qFactor) + (-1.26661 * qFactor * qFactor * qFactor);
b3Coeff = 0.422205 * qFactor * qFactor * qFactor;
normalizationCoeff = 1 - ((b1Coeff + b2Coeff + b3Coeff) / b0Coeff);
vDenCoeff = [b0Coeff, -b1Coeff, -b2Coeff, -b3Coeff] / b0Coeff;
vXSignal = zeros(61, 1);
vXSignal(31) = 10;
vYSignal = filter(normalizationCoeff, vDenCoeff, vXSignal);
vYSignal = filter(normalizationCoeff, vDenCoeff, vYSignal(end:-1:1));
figure();
plot(vYSignal);

 

来源:https://baike.baidu.com/item/高斯滤波/9032353?fr=aladdin

高斯滤波

编辑 讨论
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 [1]  通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
 
中文名
高斯滤波
外文名
Gaussian filter
定    义
实质上是一种信号的滤波器
应    用
图像处理计算机视觉
方    式
离散化窗口滑窗卷积、傅里叶变换

简介

编辑
高斯滤波实质上是一种信号的滤波器,其用途是信号的平滑处理,人们知道数字图像用于后期应用,其噪声 是最大的问题,由于误差会累计传递等原因,很多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。与此相关的有Gauss-Laplace变换,其实就是为了得到较好的图像边缘,先对图像做Gauss平滑滤波,剔除噪声,然后求二阶导矢,用二阶导的过零点确定边缘,在计算时也是频域乘积至空域卷积。
滤波器就是建立的一个数学模型,通过这个模型来将图像数据进行能量转化,噪声就是属于高频率部分,高斯滤波器平滑处理后降低噪声的影响。
若使用理想滤波器,会在图像中产生振铃现象。采用高斯滤波器的话,系统函数是平滑的,避免了振铃现象。

定义

编辑
高斯滤波(Gauss filter)实质上是一种信号的滤波器,其用途为信号的平滑处理,数字图像用于后期应用,其噪声是最大的问题,因为误差会累计传递等原因,大多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。

原理

编辑
图像大多数噪声均属于高斯噪声,因此高斯滤波器应用也较广泛。高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像去噪。
可以简单地理解为,高斯滤波去噪就是对整幅图像像素值进行加权平均,针对每一个像素点的值,都由其本身值和邻域内的其他像素值经过加权平均后得到。
高斯滤波的具体操作是:用一个用户指定的模板(或称卷积、掩膜)去扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。 [2] 
一维高斯分布:
二维高斯分布:

应用

编辑
高斯滤波(高斯平滑)是图像处理计算机视觉里面最常见的操作。

两种方式

编辑
在图像处理中,高斯滤波一般有两种实现方式,一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。最常见的就是第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅里叶变化的实现方法。

可分离滤波器

编辑
由于高斯函数可以写成可分离的形式,因此可以采用可分离滤波器实现来加速。所谓的可分离滤波器,就是可以把多维的卷积化成多个一维卷积。具体到二维的高斯滤波,就是指先对行做一维卷积,再对列做一维卷积。这样就可以将计算复杂度从O(M*M*N*N)降到O(2*M*M*N),M,N分别是图像和滤波器的窗口大小。

模型建立

编辑
滤波器是建立的一个数学模型,通过它来将图像数据进行能量转化,能量低的就排除掉,噪声属于低能量部分。编程运算的话就是一个模板运算,拿图像的八连通区域来说,中间点的像素值就等于八连通区的像素值的均值,这样达到平滑的效果。假如使用理想滤波器,则会在图像中产生振铃现象。如果采用高斯滤波器,系统函数为平滑的,避免了振铃现象。
由于高斯函数的傅立叶变换仍是高斯函数, 因此高斯函数能构成一个在频域具有平滑性能的低通滤波器。可以通过在频域做乘积来实现高斯滤波。均值滤波是对信号进行局部平均, 以平均值来代表该像素点的灰度值。矩形滤波器(Averaging Box Filter)对这个二维矢量的每一个分量进行独立的平滑处理。通过计算和转化 ,得到一幅单位矢量图。这个 512×512的矢量图被划分成一个 8×8的小区域 ,再在每一个小区域中 ,统计这个区域内的主要方向 ,亦即将对该区域内点方向数进行统计,最多的方向作为区域的主方向。于是就得到了一个新的64×64的矢量图。这个新的矢量图还可以采用一个 3×3模板进行进一步的平滑

 

来源:matlab

  case 'gaussian' % Gaussian filter
     siz   = (p2-1)/2;
     std   = p3;
    
     [x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
     arg   = -(x.*x + y.*y)/(2*std*std);
     h     = exp(arg);
     h(h<eps*max(h(:))) = 0;
     sumh = sum(h(:));
     if sumh ~= 0,
       h  = h/sumh;
     end;

 

posted @ 2019-10-22 17:22  梅长苏枫笑  阅读(18473)  评论(1编辑  收藏  举报