Introduction to gaussian filter 高斯滤波器

Introduction to gaussian filter

我尝试尽可能低门槛的介绍这些好玩的东东~这里只须要正态分布函数作为基础就可以開始玩图像的高斯滤波了. Don‘t panic !

在通常的图像中,像素点都非常多,非常多情况都是非常多一大块像素点记录某一个场景区域。那么这就数字离散环境下模拟出了实际生活中颜色变化连续性的事实(注意。计算机的离散环境都是对真实的模拟.)

高斯滤波是怎么回事捏?一句话的事情。就是利用高斯函数取权值,在一个区域内进行加权平均!

简单的事情永远别搞复杂了。project师的定义是什么。就是把复杂问题简单化的人. 越简单越好. 世界上本没有非常困难的问题,仅仅是阐述的人说的不够直白而已.

公式就在这里。怎么做?以下通过程序实现来“体会”并领悟高斯滤波. 不信我扯不清楚

x y 代表距离中心点的距离

这里先给出最简单的单通道黑白图像处理的函数(足够短小。可以说明算法就可以,后面会给出彩色图像的实现函数,为了把程序算法便于理解。我尽量不调用matlab的API,使用C语言的风格编写demo程序).

以下的程序没有经过不论什么优化

(操心优化之后程序便于和原来算法对比理解...所以当用户把kernel窗体调的比較大的时候(Kernel_size > 11的时候),程序会比較慢)

%***********************************************************
% code writer   : EOF
% code file     :  gaussian_filter_for_dark_Image.m
% code date     : 2014.10.25
% e-mail        : [email protected]
%
% Code Description:
%
%        Here is my implementation of gaussian filter which
% is only work for single channel image.
%
%       If you find something wrong with my code ,please touch
% me by e-mail.
%**************************************************************

function Output = gaussian_filter_for_dark_Image(Image,Kernel_size,epsilon)

    if size(Image,3) ~= 1
        fprintf('Hey guys, please input a single channel image.\n');
    end

    Location_X = zeros(Kernel_size,Kernel_size);
    Location_Y = zeros(Kernel_size,Kernel_size);

    %% Initialization for original Location.
    for row = 1 : Kernel_size
        for col = 1 : Kernel_size
            Location_X(row ,col) = (col -1) - floor(Kernel_size/2);
            Location_Y(row ,col) = (row -1) - floor(Kernel_size/2);
        end
    end

    Kernel = zeros(Kernel_size,Kernel_size);

    for row = 1 : Kernel_size
        for col = 1 : Kernel_size

            % Oh , Attention. Here we are gonna to compute the Kernel of
            % our filter.
            Kernel(row,col) = (1/(2*pi*(epsilon.^2))) * ...
            exp( - (Location_X(row,col).^2 + Location_Y(row,col).^2)./(2* (epsilon.^2) ));

        end
    end

    sum_of_Kernel = sum(Kernel(:));

    Image_Height = size(Image,1);
    Image_Width  = size(Image,2);

    Output = zeros(Image_Height,Image_Width);

    for row = 1: Image_Height
        for col = 1: Image_Width

            sum_value = 0;

            % Set the patch start location and end location.
            Kernel_row_start = row - floor(Kernel_size/2);
            Kernel_col_start = col - floor(Kernel_size/2);
            Kernel_row_end   = row + floor(Kernel_size/2);
            Kernel_col_end   = col + floor(Kernel_size/2);

            for Kernel_row = Kernel_row_start : Kernel_row_end
                for Kernel_col = Kernel_col_start : Kernel_col_end

                    %% Sum all weighted neighboring pixel by gaussian distribution.

                    if Kernel_row > 0 && Kernel_col > 0 && ...
                       Kernel_row <= Image_Height && Kernel_col <= Image_Width

                       sum_value = sum_value + ...
                       Kernel(Kernel_row - Kernel_row_start  + 1,...
                              Kernel_col - Kernel_col_start  + 1) *...
                       Image(Kernel_row,Kernel_col);
                    end
                end
            end

            Output(row,col) = sum_value/sum_of_Kernel;

        end
    end

end

測试:

參数:Kernel_size = 11, epsilon = 2.5

左图为输入图像。右边是得到的滤波结果.

假设你细致分析过Kernel_size得到的高斯权重的话就会发现。事实上Kernel_size过大是没有什么实际意义的.影响不大,一般7 和11得到的结果都非常接近。真正影响模糊效果的是epsilon, 这里epsilon取值为2.5,假设你取值小一点。图像的模糊程度就会弱(即。清晰)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2lubXloZWFydA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

既然完毕了单通道图像的高斯滤波。彩色图片的高斯滤波就变得顺理成章了,非常easy.

这里我整合了单通道和三通道的图片高斯滤波,写成一个函数(嘿嘿。I love robust)

为嘛三通道的就这么久捏....感觉跑好久...以后还是要优化一下

以下是用Kernel_win_size = 3, epsilon = 1.5的输出效果

左边是原图,右边是滤波后的结果.

%***********************************************************
% code writer   : EOF
% code file     :  gaussian_filter_for_Image.m
% code date     : 2014.10.25
% e-mail        : [email protected]
%
% Code Description:
%
%        Here is my implementation of gaussian filter .
%
%        Parameter @Image is the inputed image, @Kernel_size
% describe the size of filter kernel and @epsilon is the
% parameter in normal-distribution which you are familiar with.
%
%       If you find something wrong with my code ,please touch
% me by e-mail.
%**************************************************************

function Output = gaussian_filter_for_Image(Image,Kernel_size,epsilon)

    if size(Image,3) ~= 1 && size(Image,3) ~= 3
        fprintf('Hey guys, please input a single or three channel image.\n');
    end    

        Location_X = zeros(Kernel_size,Kernel_size);
        Location_Y = zeros(Kernel_size,Kernel_size);

        %% Initialization for original Location.
        for row = 1 : Kernel_size
            for col = 1 : Kernel_size
                Location_X(row ,col) = (col -1) - floor(Kernel_size/2);
                Location_Y(row ,col) = (row -1) - floor(Kernel_size/2);
            end
        end

        Kernel = zeros(Kernel_size,Kernel_size);

        for row = 1 : Kernel_size
            for col = 1 : Kernel_size

                % Oh , Attention. Here we are gonna to compute the Kernel of
                % our filter.
                Kernel(row,col) = (1/((2*pi*(epsilon.^2)))) * ...
                exp( - (Location_X(row,col).^2 + Location_Y(row,col).^2)./(2* (epsilon.^2) ));

            end
        end

        sum_of_Kernel = sum(Kernel(:));

        Image_Height = size(Image,1);
        Image_Width  = size(Image,2);

        if size(Image,3) == 1
            Output = zeros(Image_Height,Image_Width);
        else
            Output = zeros(Image_Height,Image_Width,3);
        end

        for row = 1: Image_Height
            for col = 1: Image_Width

                % Set the patch start location and end location.
                Kernel_row_start = row - floor(Kernel_size/2);
                Kernel_col_start = col - floor(Kernel_size/2);
                Kernel_row_end   = row + floor(Kernel_size/2);
                Kernel_col_end   = col + floor(Kernel_size/2);

                for channel = 1: size(Image,3)

                    sum_value = 0;
                    for Kernel_row = Kernel_row_start : Kernel_row_end
                        for Kernel_col = Kernel_col_start : Kernel_col_end
                            %% Sum all weighted neighboring pixel by gaussian distribution.

                            if Kernel_row > 0 && Kernel_col > 0 && ...
                               Kernel_row <= Image_Height && Kernel_col <= Image_Width

                               sum_value = sum_value + ...
                               Kernel(Kernel_row - Kernel_row_start  + 1,...
                                      Kernel_col - Kernel_col_start  + 1) *...
                               Image(Kernel_row,Kernel_col,channel);
                            end

                        end
                    end

                    %%
                    % Never forget to divide 'sum_of_kernel', otherwise your outputed image
                    % would looks like more dark than original image.
                    Output(row,col,channel) = sum_value/sum_of_Kernel;
                end
            end
        end

end

解惑:

之前你可能遇到过以下这种“高斯滤波核”

事实上,这就是别人已经算好的分布数据,然后直接用了。

而我们这里採用的是高度可定制的窗体大小Kernel_size。

本质是一样的

Don‘t panic :)

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-11-03 21:55:58

Introduction to gaussian filter 高斯滤波器的相关文章

高斯平滑 高斯模糊 高斯滤波器 ( Gaussian Smoothing, Gaussian Blur, Gaussian Filter ) C++ 实现

 发展到现在这个平滑算法的时候, 我已经完全不知道如何去命名这篇文章了, 只好罗列出一些关键字来方便搜索了. 在之前我们提到过了均值滤波器, 就是说某像素的颜色, 由以其为中心的九宫格的像素平均值来决定. 在这个基础上又发展成了带权的平均滤波器, 这里的高斯平滑或者说滤波器就是这样一种带权的平均滤波器. 那么这些权重如何分布呢? 我们先来看几个经典的模板例子: 尝试了使用这些滤波器对我们原来的图进行操作, 得到了这样的一组结果: 原图: 3x3 高斯: 5x5 高斯: 单纯从效果来看, 两个

Introduction to Gaussian Processes

Introduction to Gaussian Processes Gaussian processes (GP) are a cornerstone of modern machine learning. They are often used for non-parametric regression and classification, and are extended from the theory behind Gaussian distributions and Gaussian

深度理解高斯滤波器

1.高斯滤波器综述 高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器.高斯平滑滤波器对于抑制服从正态分布的噪声非常有效.一维零均值高斯函数为: g(x)=exp( -x^2/(2 sigma^2) 其中,高斯分布参数Sigma决定了高斯函数的宽度.对于图像处理来说,常用二维零均值离散高斯函数作平滑滤波器. 高斯函数具有五个重要的性质,这些性质使得它在早期图像处理中特别有用.这些性质表明,高斯平滑滤波器无论在空间域还是在频率域都是十分有效的低通滤波器,且在实际图像处理中得到了工程人员的

【信号、图像、Matlab】如何得到高斯滤波器的整数模板

[信号.图像.Matlab]如何得到高斯滤波器的整数模板 如何得到高斯滤波器的整数模板?这个问题困扰了我两天,上网搜索的代码,基本上都生成的小数,有的文档给写了3*3,5*5,7*7的整数形式,但是没有说是怎么得到的,应该说是我没有仔细看吧,现在恍然大悟,只要将左上角的元素化为1就可以了啊.我还以为用什么高级方法得出来的,晕死了. 二维高斯分布公式: 要得到高斯滤波器的整数模板就要从这个公式入手,这个公式在三维坐标下的形式是这样的: 我们要的高斯滤波器的整数模板相当于这个三维图形在底面(将底面网

Introduction of Servlet Filter

过滤器是一个可以转换请求或响应的标头和内容(或两者)的对象.过滤器与Web组件的不同之处在于过滤器通常不会自行创建响应.相反,过滤器提供可以“附加”到任何类型的Web资源的功能.因此,过滤器不应该对作为过滤器的Web资源有任何依赖性; 这样,它可以由多种类型的Web资源组成. 过滤器可以执行的主要任务如下. 查询请求并采取相应措施. 阻止请求和响应对进一步传递. 修改请求标头和数据.您可以通过提供请求的自定义版本来完成此操作. 修改响应标头和数据.您可以通过提供自定义版本的响应来完成此操作. 与

14.高斯滤波器

//高斯滤波 int g_nGaussianBlurValue; void on_ChangeGaussianBlurValue(int,void*) { if(g_nGaussianBlurValue>0 && g_nGaussianBlurValue%2==1) { GaussianBlur(g_srcImage_Contrast,g_dstImage_Contrast,Size(g_nGaussianBlurValue,g_nGaussianBlurValue),0,0); i

vs2015+opencv3.3.1 实现 彩色高斯滤波器 包括边缘处理

#include <opencv2\highgui\highgui.hpp> #include <iostream> #include<vector> using namespace cv; using namespace std; void gaussianFilter2(vector<uchar> corrupted, vector<uchar> &smooth, int width, int height) { int templa

vs2015+opencv3.3.1 实现 灰度高斯滤波器

#include <opencv2\highgui\highgui.hpp> #include <iostream> #include<vector> using namespace cv; using namespace std; void gaussianFilter2(vector<uchar> corrupted, vector<uchar> &smooth, int width, int height) { int templa

Introduction of Servlet Filter(了解Servlet之Filter)

API文档中介绍了public Interface Filter(公共接口过滤器) Servlet API文档中是这样介绍的: ‘A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both. Filters perform filte