高斯金字塔可以作为 图像特征提取 的预处理步骤
—————————————————————————————————————————————————————————————————————————————
过程: 假设输入图像为 Input_Img;大小为 256*256
① 先对 Input_Img 进行高斯滤波,然后下采样,得到 Gauss_Img1;这时 Gauss_Img1 大小为 128*128;
② 对 Gauss_Img1进行高斯滤波, 然后下采样, 得到 Gauss_Img2;这时 Gauss_Img2大小为 64*64;
③ 对 Gauss_Img2进行高斯滤波, 然后下采样, 得到 Gauss_Img3;这时 Gauss_Img3大小为 32*32;
依次进行下去…………
最简单的matlab代码:
img1=imread('test.jpg');
[m,n]=size(img1);
w=fspecial('gaussian',[3 3]);
img2=imresize(imfilter(img1,w),[m/2 n/2]);
img3=imresize(imfilter(img2,w),[m/4 n/4]);
img4=imresize(imfilter(img3,w),[m/8 n/8]);
img5=imresize(imfilter(img4,w),[m/16 n/16]);
imshow(img1);
figure,imshow(img2);
figure,imshow(img3);
figure,imshow(img4);
figure,imshow(img5);
注意:这里高斯滤波器用的是3*3大小,而sigma默认为0.5;可以相应调整滤波器大小和sigma的值,获得的效果也不尽相同;
—————————————————————————————————————————————————————————————————————————————
这里面有关于高斯滤波器的生成函数,如下:
function r=GuassionMatrix(delta,radius)radius=ceil(radius);n=2*radius+1;r=zeros(n,n);%tempMatrix=zeros(radius,radius);for i=-radius:radiusfor j=-radius:radiusr(i+radius+1,j+radius+1)=exp(-(i^2+j^2)/2*delta^2);endend;r=round(100*r);r=r/sum(sum(r));
当然,用matlab自带的函数也可以
w=fspecial('gaussian',[n n], sigma );
____________________________________________________________________________________________________________________________________
还有另外的说法(转自http://blog.sina.com.cn/s/blog_68f909c30100r0g1.html)
高斯金字塔(Gaussian Pyramid):高斯金字塔 里有两个概念:组(Octave)和层(Level或Interval),每组里有若干层。
高斯金字塔的构造是这样的:
(1)第一组的第一层为原图像,然后将图像做一次高斯平滑(高斯卷积、高斯模糊)高斯平滑里有一个参数
σ ,在
SIFT里作者取
1.6;
(2)将σ乘一个比例系数k作为新的平滑因子来平滑第一组第二层得到第三层。
(3)重复若干次,得到L层他们分别对应的平滑参数为:
0,
σ,
kσ,
k2σ....。
(4)将最后一幅图像做比例因子为
2 的降采样得到第二组的第一层,然后对第二组的第一层做参数是
σ 的高斯平滑,对第二层做
kσ的平滑得到第三层.....这里一定注意:每组对应的平滑因子是一样的。而不是像有的资料上说的持续递增。
这样反复形成了
O组
L层。一般模糊的高斯模板长宽都约为
6σ(这里
σ为当次的平滑因子,就是可能是
kσ,
k2σ..)
具体代码这里不贴了
—————————————————————————————————————————————————————————————————————————————
如何在 图片 固定位置生成 高斯函数场?
function ImgOutput=CreatGauss(ImgInput,m,n,sigma)[x,y]=size(ImgInput);a=1:x;b=1:y;[A,B]=meshgrid(a,b);arg= -((A-n).*(A-n) + (B-m).*(B-m))/(2*sigma*sigma);h=exp(arg);ImgOutput((i-1)*m+1:i*m,(j-1)*n+1:j*n)=h;
上面所示函数为在[m,n]处生成 标准差为 sigma 的高斯场,图片如下:
ImgInput=zeros(200,200);
ImgOutput=CreatGauss(ImgInput, 100,100,50)