我试图找到高斯平滑操作的离散近似,如链接所示:
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 。整个问题看起来像这样:
因此,我必须预先生成一个矩阵 G ,它近似于平滑函数,以便将此目标提供给求解器。我正在使用 cvx ,如果有帮助的话。
答案 0 :(得分:1)
通常人们通过顺序应用两个1D高斯函数而不是一个2D函数(可分离滤波器的想法)来做到这一点。您可以快速近似1D水平高斯,将其应用于每个像素,将结果保存在temp中,然后将垂直高斯应用于temp。预期的加速非常显着:O(ksize * ksize) - > O(ksize + ksize)
答案 1 :(得分:0)
您可以通过框过滤器使用近似高斯平滑,例如,请参阅integgaussfilt.m
:
此函数通过重复应用来近似高斯滤波 平均滤波器。平均值通过integral images执行 导致固定且非常低的计算成本独立于 高斯大小。
答案 2 :(得分:0)