【3.15】matlab 高斯滤波,快速滤波

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

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

  

1 传统型

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

Matlab实现代码:

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代码实现:

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:

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

  

参考资料:Recursive implementation of the Gaussian filter。 Ian T. Young,1995

     http://dsp.stackexchange.com/questions/22075/recursive-implementation-of-the-gaussian-filter

时间: 2025-01-02 23:55:24

【3.15】matlab 高斯滤波,快速滤波的相关文章

python实现直方图均衡化,理想高通滤波与高斯低通滤波

写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化,实验算法仅供参考. 实验要求 实现图像直方图均衡化,要求显示均衡化前.后直方图以及均衡化后图像. 对单通道图像进行DFT变换,要求显示幅度图和相位图,并设计理想高通滤波器和高斯低通滤波器对图像进行频域滤波,并显示滤波之后的图像. 注:除DFT和IDFT外,不允许调库 实验代码 代码首先贴在这里,仅供

java实现中值滤波均值滤波拉普拉斯滤波

目录 来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程 均值滤波 中值滤波 拉普拉斯滤波 Sobel滤波 注意 来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程 均值滤波 均值滤波的实现很简单,把滤波器的各个像素点相加在取平均就可以了. public static int getAVEcolor(int x,int y,BufferedImage bi) { int color=0; int r=0,g=0,b=0; for(int i=x-1;i<=x+1;i++) for

opencv3 图片模糊操作-均值滤波 高斯滤波 中值滤波 双边滤波

#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; //均值滤波模糊处理int demo_blur(){ char win1[] = "window1"; char win2[] = "window2"; Mat img1, img2; img1 = imread("D://images//4.jpg&quo

图像处理之基础---高斯低通滤波在指定区域画放大圆形图

像淘宝中的物品图片进行放大扫描效果: 上图中图一为原图,现给定素材,需要将图像画城图二然后输出.现在问题是,给定的图像都是矩形,怎么将矩形的图片画到中间的那两个圆里面呢? http://download.csdn.net/detail/raistlic/5054386 代码 http://bbs.csdn.net/topics/390363649

频率域滤波_滤波基础

这节来介绍一下频率域滤波. 在空间域内,我们是直接对像素进行操作以增强图像的有用信息.像高斯平滑,是取一个模板与图像进行卷积操作,得到处理后的图像.不同的变换域可以很方便的解决某种问题,例如空间域中值滤波是取一个区域的中值替代中间像素的灰度,可以很好的去除椒盐噪声例如下图中的(1)(2)(3).           (1)原图        (2)带有椒盐噪声的图像 (3)图像(2)复原之后的图像 (4)部分区域带有周期噪声 但不是所有的图像都可以在空间域进行图像的增强,有的时候都不知道用什么滤

opencv初学习-椒盐噪声-中值滤波-均值滤波-腐蚀膨胀

#include <opencv2\opencv.hpp>#include <opencv2\highgui\highgui.hpp>#include <opencv2\imgcodecs\imgcodecs.hpp>#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<iomanip>void salt(cv

电容滤波&amp;电感滤波原理

整流电路的输出电压不是完美的直流,从示波器观察整流电路的输出,能看到有闫的脉动成份,这就是纹波.为了获得比较理想的直流电压,需要使用滤波电路. 滤波电路中常常使用电感.电容.电阻.其中电感和电容都是具有储能作用的电抗元件,意思就是电容电容对不同频率的信号具有不同的电抗,而一定意义上说电阻对所有频率的信号都具有相同的电阻.而纹波是具有交流特性的,因此电容.电感对纹波具有与电阻不同的电抗.电容对频率越高的信号抗性越小,电感对频率越高的信号抗性越高.滤波电路的本质就是通过构建这个一个电路网络,使这个电

MATLAB GUI制作快速入门

创建空白的GUI在MATLAB命令行中输入guide新建GUI,选择Blank GUI (Default),点击确定后就生成了一个空白的GUI制作界面,如下图所示 图1制作GUI的具体过程简单加法器将可编辑文本拖入界面中双击可编辑文本,在String栏中可以修改相应的文字,Tag栏是相当于给每个文本的一个标记,在后面的输入输出环节作用非常大.将静态文本拖入界面中,双击它,同样可以在String栏中修改文本内容:同理,将按钮拖入界面中,修改其String为运行,它的作用相当于运行程序的开关.点击菜

利用matlab自带函数快速提取二值图像的图像边缘 bwperim函数

clear all;close all;clc; I = imread('rice.png'); I = im2bw(I); J = bwperim(I); % 提取二值图像图像边缘 figure; subplot(121);imshow(I);title('原二值图像'); subplot(122);imshow(J);title('图像边缘'); ? 其他提取图像边缘的方法: 利用膨胀和腐蚀提取图像边缘 matlab实现 https://blog.csdn.net/Ibelievesunsh