高斯平滑的离散逼近

时间:2014-03-12 22:19:12

标签: matlab image-processing computer-vision convolution smoothing

我试图找到高斯平滑操作的离散近似,如链接所示:

http://bit.ly/1cSgkwt

G 是一些离散平滑内核,在这种情况下为高斯, * 是卷积操作。基本上,我想将平滑内核应用于图像中的每个像素。我在MATLAB中这样做,并使用以下代码创建矩阵 G ,这是天真的,因此很慢:

z = rgb2gray(imread('train_02463_1.bmp'));
im_sz = size(z);
ksize = 5;

% Gaussian kernel of size ksize*ksize
gw_mat = g_sigma(1,2*ksize+1)'*g_sigma(1,2*ksize+1);

G = sparse(length(ksize+1:im_sz(1)-ksize),prod(im_sz));
for i = ksize+1:im_sz(1)-ksize
    for j = ksize+1:im_sz(2)-ksize

    [x,y] = meshgrid(i-ksize:i+ksize,j-ksize:j+ksize);
    row_num = sub2ind(im_sz,i,j);
    colnums = sub2ind(im_sz,x,y);
    G(row_num,colnums(:)) = gw_mat(:)';

    end
end

有更有效的方法吗?

编辑:我应该为没有完整指定问题而道歉。下面的大部分答案都是有效的,但这里的问题是上面的近似是优化目标的一部分,其中变量是 z 。整个问题看起来像这样:

http://goo.gl/rEE02y

因此,我必须预先生成一个矩阵 G ,它近似于平滑函数,以便将此目标提供给求解器。我正在使用 cvx ,如果有帮助的话。

3 个答案:

答案 0 :(得分:1)

通常人们通过顺序应用两个1D高斯函数而不是一个2D函数(可分离滤波器的想法)来做到这一点。您可以快速近似1D水平高斯,将其应用于每个像素,将结果保存在temp中,然后将垂直高斯应用于temp。预期的加速非常显着:O(ksize * ksize) - > O(ksize + ksize)

答案 1 :(得分:0)

您可以通过框过滤器使用近似高斯平滑,例如,请参阅integgaussfilt.m

  

此函数通过重复应用来近似高斯滤波   平均滤波器。平均值通过integral images执行   导致固定且非常低的计算成本独立于   高斯大小。

答案 2 :(得分:0)

使用MATLAB在图像上应用空间不变滤镜的最快方法是使用imfilter
imfilter会自动注意到" Seperable"内核并将分两步(垂直/水平)应用它。

要创建一些已知且有用的内核,您可以查看fspecial