xfdxz 发表于 2007-7-4 17:20

请教怎样用matlab实现用指定的高斯核与图像作卷积

本帖最后由 牛小贱 于 2015-3-24 12:00 编辑

我知道在matlab中有fspecial函数可以产生高斯函数
然后可以通过卷积命令将图像和高斯函数卷积
如:
Img = imread('lena.bmp');
Img = double(Img);
sigma=1.5;    % scale parameter in Gaussian kernel for smoothing.
g=fspecial('gaussian',10,sigma);
Img_n = conv2(Img,g,'same');   结果见图1
但是我不太清楚matlab中的fspecial函数是产生高斯核的具体公式
现在我想指定一个高斯核
g(x,y)=(1/4*pi*alf)*exp(-(x^2+y^2)/(4*alf))
与图像卷积,有两个问题搞不清楚:

1 取alf=5,我按照上面的式子生成高斯函数,在与图像卷积后的结果变得很黑,代码如下
alf = 5;
for i=1:10
    for j=1:10
      g(i,j) = exp(-(i^2+j^2)/(4*alf))/(4*pi*alf);
    end
end
Img_n = conv2(Img,g,'same');         结果见图2!!

2 由于我在后面的处理当中需要用到g的傅立叶变化模值与图像的傅立叶变化的乘积,因此g的size应该和Img的size一样吧,
可是用
for i=1:256
    for j=1:256
      g(i,j) = exp(-(i^2+j^2)/(4*alf))/(4*pi*alf);
    end
end
   产生的g只有左上角部分有值,其余的地方都是零。这样卷积的结果就变成了图3

请教各位 我到底是哪个地方做错了?

花如月 发表于 2007-7-5 09:53

你的高斯核函数有问题,几乎就是个平面,滤波性能太差了

xfdxz 发表于 2007-7-5 14:16

可不可以详细讲解一下?

我用的高斯函数有问题吗? 这是看参考文献中用的。
定义时是否要这样逐点计算呢,这样不可避免的往右下计算时值会越算越小。
还请详细指点下:handshake

花如月 发表于 2007-7-5 21:38

回复 #3 xfdxz 的帖子

本帖最后由 牛小贱 于 2015-3-24 11:59 编辑

n=10;%定义模板大小
n1=floor((n-1)/2);%确定中心
for i=1:n
    for j=1:n
      g(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*alf))/(4*pi*alf);
    end
end用这个g就可以,结果见附图。另外滤波模板太大了没有任何意义,只是增加计算量而已。256的和20的差别用肉眼基本都看不出来

[ 本帖最后由 花如月 于 2007-7-5 21:59 编辑 ]

wangzl1116 发表于 2012-9-7 23:06

本帖最后由 牛小贱 于 2015-3-24 11:59 编辑

高斯核的计算代码是:
sigma=1;
n=10;
n1=((n+1)/2);
for i=1:n
    for j=1:n
      g(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(2*sigma^2))/(2*pi*sigma^2);
    end
end拜托你们,高斯分布公式都是错的

wonderful-boy 发表于 2015-3-23 21:40

学习了...

南方有嘉木 发表于 2015-4-13 09:28

看不到附件啊

chybeyond 发表于 2015-4-13 09:38

南方有嘉木 发表于 2015-4-13 09:28
看不到附件啊

查看本版置顶帖:新手必读之如何获取积分提高权限

南方有嘉木 发表于 2015-4-13 10:22

chybeyond 发表于 2015-4-13 09:38
查看本版置顶帖:新手必读之如何获取积分提高权限

谢谢解决了问题
页: [1]
查看完整版本: 请教怎样用matlab实现用指定的高斯核与图像作卷积