网上介绍针对图像进行高斯模糊的文章不少,其原理比较简单,这里就不做过多介绍。这里简单总结一下实现高斯模糊的几种算法(假设图像大小是M*N,filter的半径是r,注意,很多文章使用的术语是filter size,指的是半径大小或者直径大小,一般情况下filter的半径r取3倍或者4倍的sigma):
1.最原始的实现方法是,使用高斯函数生成高斯模板,然后使用该模板对图像做卷积(convolution)。该方法的算法复杂度是O(M*N*r^2),也就是,对每个像素而言,复杂度是O(r^2),与滤波器大小成quadratic关系。如果增大滤波器size,算法会明显减慢。
下面是Matlab实现的代码(注意,为了代码方便,以下代码中出现的filter size均指滤波器直径,而不是半径!):
function [T] = GenGaussFilterKernel(size, sigma)
% here the size is the diameter of the filter
if mod(size, 2) == 0
size = size + 1;
end
T = zeros(size, size);
distMat = zeros(size, size);
centerIdx = ceil(size / 2);
for i = 1:size
for j = 1:size
distMat(i,j) = sqrt(abs(i - centerIdx) ^ 2 + abs(j - centerIdx) ^ 2);
end
end
T = exp(-distMat.^2 / (2 * sigma^2));
function [img_ext] = PaddingImgByMirrorEdge(img, r)
[h,w] = size(img);
% make a larger image, mirror the edges
img_ext = zeros(h + 2*r, w + 2*r);
img_ext(r+1:h+r, r+1:w+r) = img;
img_ext(1+r:h+r, 1:r) = fl