高斯滤波/高斯平滑/高斯模糊的实现及其快速算法(Gaussian Filter, Gaussian Smooth, Gaussian Blur, Fast implementation)

news/2024/7/6 1:49:02 标签: filter, 算法, fft, matlab, image

网上介绍针对图像进行高斯模糊的文章不少,其原理比较简单,这里就不做过多介绍。这里简单总结一下实现高斯模糊的几种算法(假设图像大小是M*Nfilter的半径是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) = flipdim(img(1:h, 2:r+1), 2); %add left border
img_ext(1+r:h+r, w+r+1:w+r+r) = flipdim(img(1:h, w-r:w-1), 2); %add right border
img_ext(1:r, 1:w+r+r) = flipdim(img_ext(r+2:r+r+1, 1:w+r+r), 1); %add up border
img_ext(h+r+1:h+r+r, 1:w+r+r) = flipdim(img_ext(h+r-r:h+r-1, 1:w+r+r), 1); %add bottom border

 

function [I] = ImageConvolution(img, filterKernel)

[h,w] = size(img);
filterSize = size(filterKernel);
r = floor(filterSize(1) / 2);

I = zeros(h, w);

% make a larger image, mirror the border to extend it
imgExt = PaddingImgByMirrorEdge(img, r);

% convolution
sumFilter = sum(sum(filterKernel));
tempRegion = zeros(filterSize);
for i = 1 : h
    for j = 1 : w
        tempRegion = imgExt(i:i+2*r, j:j+2*r);
        I(i,j) = sum(sum(double(tempRegion) .* filterKernel)) / sumFilter;
    end
end

I = uint8(I);


2.高斯滤波器的kernel是可分离的(separable),也就是说,可以将2D的高斯kernel分解为两个1D的kernel,先沿x方向对图像进行1D高斯kernel的卷积,然后沿y方向对图像进行1D的高斯kernel卷积,最后的结果和使用一个2D高斯kernel对图像卷积效果是一样的。这样一来,针对每个像素,滤波器的算法复杂度降为O(r)。

3.使用FFT-based convolution。因为图像的convolution等价于FFT转换后频域的乘积,所以可以将高斯kernel扩展至与图像同等大小,然后分别对图像和高斯kernel进行FFT变换,然后直接将两者的FFT结果图像按照per pixel的方式相乘,最终结果再逆FFT变换回去。该算法总体复杂度为O(M*N*log(M*N)),针对每个像素,滤波器的复杂度为O(log(M*N))。可以看到,当滤波器size比较小时,该算法不如使用可分离的1D高斯卷积,而当滤波器size比较大(r > log(M*N))时,FFT-based卷积速度会比较快。使用Matlab实现基于FFT的高斯模糊,这里有一篇讲解非常详细的文章。

Matlab代码如下(注意,为了代码方便,以下代码中出现的filter size均指滤波器直径,而不是半径!):

function [I] = GaussianSmooth(img, filterSize, sigma, is_use_fft)
% here the size is the diameter of the filter

if nargin < 4
    is_use_fft = 1;
end

T = GenGaussFilterKernel(filterSize, sigma); %generate gaussian kernel
[h, w] = size(img);
[d1, d2] = size(T);
r = floor(d1 / 2);
r1 = floor(h / 2);
r2 = floor(w / 2);

if is_use_fft == 0
    % use convolution to implement
    I = ImageConvolution(img, T);
else
    % use fft to implement Gaussian smooth
    extImg = PaddingImgByMirrorEdge(img, r);
    extT = zeros(size(extImg)); %extend filter kernel to the same size
    extT(1:end-h+1, 1:end-w+1) = T; %just place the original kernel on the topleft
    
    fftImg = fft2(extImg);
    fftT = fft2(extT);
    resFFT = fftImg .* fftT; %multiply the FFT result
    resI = ifft2(resFFT); %inverse FFT
        
    % calculate coefficients of Gaussian smooth
    extCoef = ones(size(extImg));
    fftCoef = fft2(extCoef);
    resCoef = fftCoef .* fftT;
    resC = ifft2(resCoef);
    
    % output image
    I = uint8(resI ./ resC);
    I = I(2*r+1:2*r+h, 2*r+1:2*r+w); 
end


4.递归高斯滤波(Recursive Gaussian Filter)算法。比上面的算法更进一步,有人提出一些approximate高斯滤波的算法,可以使算法速度不依赖于滤波器size,针对每个像素而言,滤波器的算法复杂度是O(1)级别的。这方面的算法原理介绍比较复杂,要理解信号处理相关的知识才能理解(如z变换等,参见如下参考文献)。所幸的是,算法本身其实相当简单,大概思路是正向扫描一遍并累积像素值(累积时使用特定的系数可以approximate高斯kernel),然后再反向扫描一遍并累积像素值,done!而且算法也是separable的,可以x和y方向分别做,所以速度可以达到非常之快!有相关的代码在此,NVIDIA也有CUDA代码在此,最新的GPU快速算法见这里。原理可以参考这里和这里。以下是几篇这方面的参考文献:

[1] Rachid Deriche - "Recursively implementing the Gaussian and its derivatives", 1993.
[2] Lucas J. van Vliet, Ian T. Young and Piet W. Verbeek - "Recursive Gaussian derivative Filters", 1998
[3] Dave Hale, "Recursive Gaussian Filters", CWP-546
[4] Luis Alvarez, Rachid Deriche, Francisco Santana - "Recursivity and PDE's in Image Processing", 2000

 

 


http://www.niftyadmin.cn/n/1866029.html

相关文章

图片配置文件设置 索尼a7s2_索尼微单a7R4、a7R3 a7R2系列相机专题课程

作为号称市场占有率已经第二的索尼索尼微单用户应该已经不少了但是很多入手了索尼微单的朋友都知道索尼的相机功能键有些反人类设计很不习惯为了不让您的相机吃灰或者一直在使用错误的拍摄方式本次系统课程就从超级实用的索尼微单相机设置讲起索尼菜单逻辑混乱&#xff1f;是的…

图像处理中的全局优化技术(Global optimization techniques in image processing and computer vision) (一)

MulinB按&#xff1a;最近打算好好学习一下几种图像处理和计算机视觉中常用的 global optimization (或 energy minimization) 方法&#xff0c;这里总结一下学习心得。分为以下几篇&#xff1a; 1. Discrete Optimization: Graph Cuts and Belief Propagation (本篇) 2. Qu…

vant 怎么显示评分 评分组件_张一山版本的鹿鼎记评分垫底,这些童星怎么回事,个个失去光环...

张一山版本的鹿鼎记评分只有2.6分&#xff0c;这真是让很多观众觉得想不到。张一山是童星出生&#xff0c;当年所为大家带来的家有儿女真的成为搞笑担当&#xff0c;在长大之后余罪中的表现也非常出色&#xff0c;被人们称之为实力派的年轻演员&#xff0c;可是现在到底怎么了&…

图像处理中的全局优化技术(Global optimization techniques in image processing and computer vision) (二)

MulinB按&#xff1a;最近打算好好学习一下几种图像处理和计算机视觉中常用的 global optimization (或 energy minimization) 方法&#xff0c;这里总结一下学习心得。分为以下几篇&#xff1a; 1. Discrete Optimization: Graph Cuts and Belief Propagation 2. Quadratic…

electron 如何拦截关闭事件_Electron+React+Antd(2)工程搭建

electron桌面应用构建指南开发环境 and 正式环境 预览命令配置安装依赖yarn add cross-env --devyarn add concurrently --devyarn add wait-on --dev修改 public/electron.js 新增环境判断// electron 主进程 const { app, BrowserWindow } require(electron);const isPro p…

图像处理中的全局优化技术(Global optimization techniques in image processing and computer vision) (三)

MulinB按&#xff1a;最近打算好好学习一下几种图像处理和计算机视觉中常用的 global optimization (或 energy minimization) 方法&#xff0c;这里总结一下学习心得。分为以下几篇&#xff1a; 1. Discrete Optimization: Graph Cuts and Belief Propagation 2. Quadratic…

刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)

最近学习了一些关于三维空间旋转相关的知识&#xff0c;借此梳理一下备忘。 三维空间的旋转(3D Rotation)是一个很神奇的东东&#xff1a;如果对某个刚体在三维空间进行任意次的旋转&#xff0c;只要旋转中心保持不变&#xff0c;无论多少次的旋转都可以用绕三维空间中某一个轴…

凸台可以延伸吗_跟女的聊天怎么找话题?其实你需要的是这样来延伸话题

现在网络已经成为很多人找寻对象的途径之一&#xff0c;但对于男生来说最困难的就是聊天&#xff0c;我们经常会为没有话题而感到尴尬&#xff0c;影响恋情的进展。其实聊天内容并不是很重要&#xff0c;营造出良好的氛围才是主要目的。今天我们就来学习一下&#xff0c;跟女的…