matlab 高斯滤波模板是怎么选取的?怎么取均值、方差的值对应出来的模板系数是整数呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab 高斯滤波模板是怎么选取的?怎么取均值、方差的值对应出来的模板系数是整数呢?相关的知识,希望对你有一定的参考价值。

首先用fspecial给出来的不会是整数(除非是1x1的矩阵)
因为fspecial出来的矩阵都是归一化的,所有元素的和是1
因为模版滤波相当于对模版对应大小的图像快进行加权平均,权重的总应该是1

就简单的均值滤波,例如2x2的滤波模版应该是
| 0.25 0.25 |
| 0.25 0.25 |
而对于高斯滤波,以你给的3x3模版为例,归一化后为
0.0625 0.1250 0.0625
0.1250 0.2500 0.1250
0.0625 0.1250 0.0625
相当于原来的矩阵 除以它自身所有元素的和

如过先不考虑归于化,想用整数的序列近似高斯滤波模版
简单起见,我们先考率1维的情况,那么可以简单的使用杨辉三角来近似
长度为3时[1 2 1]
长度为4时[1 3 3 1]
长度为5时[1 4 6 4 1]
...........
因为使用杨辉三角可以很好地保留高斯模版的一个性质
两个高斯模版的卷积还是高斯模版
例如两个长度3的杨辉三角序列,卷积出长度5的序列
conv([1 2 1],[1 2 1])
ans =
1 4 6 4 1

而二维的模版,可以用一维的模版用矩阵乘法获得
[1 2 1]'*[1 2 1]
ans =
1 2 1
2 4 2
1 2 1

获得整数矩阵后,可以除以其所有元素的总和来归一化
参考技术A 你是问为什么不是小数吗?
由于模板大小限制,这些处理都是离散的,模板越大这些就越接近正确结果。
其实你想想,如果一个小小的3*3模板你用小数做根本没意义的,计算精度没提高徒增计算时间。

高斯滤波模板3*3 5*5 7*7 这些数不用你记住,下次用直接复制过来就可以。
其实都是对高斯函数的离散模拟。
欢迎追问。追问

您能加我 球球 吗?我想仔细问一下,谢谢啊,三一七一八二三六二

追答

在这里问就行,其他人也能看到。

追问

我用这个语句h = fspecial('gaussian',[5,5], 2);得出来的是

我想知道,为什么差那么多呢?我菜鸟一个,刚接触TLAB,多谢啊

追答

首先呢,你要知道高斯滤波中很重要的一个参数是sigma.
这个参数会决定高斯滤波的强度,也就是高斯函数的形状。
不同的参数会带来不同的模板,所以两个都是高斯滤波,但是形状不一样很正常。

第二,你要知道什么是高斯滤波,由于图像都是一个像素一个像素的离散的变化,而现实中的高斯函数又是无限大小(你可以把x=10000带进去,y只是会很接近0罢了)
所以我们用到的高斯模板都是模拟出来高斯函数的形状,大体就是中间鼓鼓的,边上平平的。
所以你用整数模拟也是模拟,小数模拟也是模拟,不会有完全的真实的实现。

第三,小数的来源我猜是将对应的坐标带入方程求解的。
用整数的原因是计算会很快。

追问

您的意思是这个整数的模板也是近似符合高斯函数图像的吗?如果用3×3或者5×5的模板处理一幅图像,那么这行编码需要怎么改呢?谢谢了,h = fspecial('gaussian',[5,5], 2);

追答

我建议你去搜索,MATLAB图像卷积运算。
自己学习的过程很重要,你自己实在搞不定再来问。

追问

我现在很想知道用高斯模板处理图像的时候,怎么编写那句代码,不知道均值和方差的取值。h = fspecial('gaussian',[5,5], ?);这个方差取多少才能是那个整数模板呢?多谢啊

追答

哎 你真够懒的啊
imfilter 自己看去

追问

h = imread('1.bmp')
1 2 1
f=[ 2 4 2 ]
1 2 1
imfilter(h,f) 是这样吗?请指教啊,哈哈

追答

f=[1,2,3, 4,5,6 7,8,9];
我两年没用matlab了 我习惯上面的写法
你自己测试下结果吧

追问

我运行了,不好使啊

追答

clear all
g0=imread('d:\image\ha.jpg');
g0 = g0(:,:,2); %三维转二维

figure(1);imshow(g0) ;title('原图')
g1=imnoise(g0,'salt & pepper',0.2)
g1=im2double(g1);
figure(2);imshow(g1);title('加入椒盐噪声')

h8=[0 -1 0;-1 5 -1;0 -1 0];
g9=filter2(h8,g1,'same');
figure(10);imshow(g9);title('高斯高通滤波');

h1=fspecial('gaussian',4,0.3)
g2=filter2(h1,g1,'same')
figure(3);imshow(g2);title('进行高斯滤波')

2014-1-16 16:40:26
弄出来了没有?

本回答被提问者采纳

信号图像Matlab如何得到高斯滤波器的整数模板

#【信号、图像、Matlab】如何得到高斯滤波器的整数模板

如何得到高斯滤波器的整数模板?这个问题困扰了我两天,上网搜索的代码,基本上都生成的小数,有的文档给写了33,55,7*7的整数形式,但是没有说是怎么得到的,应该说是我没有仔细看吧,现在恍然大悟,只要将左上角的元素化为1就可以了啊。我还以为用什么高级方法得出来的,晕死了。

##二维高斯分布公式:

要得到高斯滤波器的整数模板就要从这个公式入手,这个公式在三维坐标下的形式是这样的:

我们要的高斯滤波器的整数模板相当于这个三维图形在底面(将底面网格化,也就是离散化,计算机不能处理连续的东东)的投影,将曲面的高度换算成网格里面的值,这是我们要的模板了。

##计算整数模板的公式
假设我们的模板放在矩阵M中,M的大小为(2k+1)*( 2k+1),那么M(i,j)的值为:

说明:这就是由连续公式得到的,只不过这里的M是一个矩阵,原点在矩阵的中间,所以有(i-k-1)以及(j-k-1)为的就是让原点到矩阵中间。

##一个Matlab代码

clear;
k=1;              %模板长度的一半
row = 2*k+1;      %模板长度
col = 2*k+1;
sigma2=1;         %方差
for i=1 : row
    for j=1 : col
        fenzi=double((i-k-1)^2+(j-k-1)^2);
        A(i,j)=exp(-fenzi/(2*sigma2))/(2*pi*sigma2);
    end
end
A                           %显示小数形式
C=floor(A.*(1/A(1,1)));      %左上角化为1(想了很久整数是怎么得出来的,只要这样就可以了,郁闷)

这个代码得到的是一个7*7,sigma=1高斯滤波器的小数和整数模板,如下:
小数:

整数:

当时想了很久怎样才能得到整数形式的模板,无意间从网上看了将左上角的元素化为1就可以了,我只能说自己的脑壳真是迟钝啊。

##要说明的两点

  • 上面的整数模板要用于滤波的话,需要归一化,就是在整个模板的前面加一个系数,这个系数是:1/(所有整数总和).
  • 生成的模板,与公式里的一个东西有关:sigma,这对生成的模板数个影响很大。这里给一张不同sigma的一维高斯分布图,二维的类似,理解sigma取值对函数图形的影响就可以了:

    Sigma越小,分布越集中。

##再给几个不同大小,不同sigma的整数模板



之所以放这几个模板,可以发现,sigma的取值对模板的影响很大,所以如何取sigma,这应该是个经验性的问题。

以上是关于matlab 高斯滤波模板是怎么选取的?怎么取均值、方差的值对应出来的模板系数是整数呢?的主要内容,如果未能解决你的问题,请参考以下文章

怎样用matlab进行图像滤波处理

基于MATLAB的均值滤波算法实现

信号图像Matlab如何得到高斯滤波器的整数模板

图像的滤波与增强

信号图像Matlab如何得到高斯滤波器的整数模板

OpenCV-Python系列六:图像滤波