티스토리 뷰

목차

    반응형

    [C++프로그래밍] Gaussian(가우시안) 필터 알고리즘 개념과 소스


    Gaussian 스무딩의 공식은 아래이고, C++프로그래밍 소스로 구현하면 그 아래처럼 됩니다.


    C++프로그래밍. 가우시안 공식[C++ Gaussian Filter 예제]


    C++프로그램 Gaussian 공식[C++ Gaussian Filter 예제]


    아래에서 소개하는 C++프로그래밍 가우시안 필터 소스는 Qt Creator에서 작업한 결과입니다. Qt로 구성했으나, 일반적인 C++프로그래밍 소스와 호환됩니다. Qt만의 특성은 딱히 없습니다. 있어봐야 QVector 정도인데, 일반 Vector와 같습니다. (Qt프로그래밍과 C++프로그래밍의 차이는 매우 적어요. Qt 소스지만, C++ 프로그래밍에도 적용할 수 있는 가우시안 필터 소스입니다)

    헤더 파일 (Gausian .h)


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #ifndef GAUSIANFILTER_H_
    #define GAUSIANFILTER_H_
     
    #include <QPolygonF>
     
    class GausianFilter
    {
        friend class QwtController;
     
        static const int kKernelLevel = 5;
        static double kKernel[kKernelLevel];
     
    public:
        GausianFilter(void);
        virtual ~GausianFilter(void);
     
    public:
        void ApplyFilter(QVector<quint16> &point);
     
    private:
        double sum_kernel_;
        double weight_;
    };
     
    #endif
    cs


    위 헤더는 가우시안 알고리즘 필터를 의미합니다. 중간에 friend 클래스는 무시하셔도 괜찮습니다.


    cpp 파일 (Gausian .cpp)


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include "gausian.h"
     
    double GausianFilter::kKernel[kKernelLevel] = {
        0.135335,
        0.606531,
        1,
        0.606531,
        0.135335
    };
     
    GausianFilter::GausianFilter(void
      : sum_kernel_(0.0),
        weight_(0.0)
    {
        for (int i = 0; i < kKernelLevel; ++i)
            sum_kernel_ += kKernel[i];
     
        weight_ = 1 / sum_kernel_;
    }
     
    GausianFilter::~GausianFilter(void) { }
     
    void GausianFilter::ApplyFilter(QVector<quint16> &point)
    {                
        int size = point.size();
     
        QVector<quint16> tmp;
        tmp.swap(point);
     
        for (int i = 0; i < size++i) {
            if (i < (kKernelLevel * 0.5||
                i >= (size - (kKernelLevel * 0.5))) {
                    point.push_back(tmp[i]);
            } else {
                double out_sum = 0;
     
                int k = 0;
     
                for (int j = i - (kKernelLevel * 0.5), k = 0;
                        k < kKernelLevel; ++j, ++k)
                        out_sum += tmp[j] * kKernel[k];
     
                        point.push_back(out_sum * weight_);
                }
            }
    }
    cs


    가우시안 C++프로그램 실행 결과는 아래와 같습니다.


    가우시안 필터 적용 참조 - Gaussian function demos [클릭]


    C++ 가우시안 알고리즘 실행[C++ Gaussian Filter 예제]


    C++ 가우시안 알고리즘


    어떤 그림에 적용하는지에 따라 달라질테니 위의 소스를 변경해 사용하시면 되겠습니다.


    C++프로그래밍에 있어서 맹점은 컨테이너를 어떻게 다루느냐입니다. 컨테이너 다루는 소스에 따라 성능은 크게 차이납니다.

    Gaussian C++프로그램 만들때도 마찬가지이니 가우시안 알고리즘 적용 코드를 최적화하는 방법도 필요해요.


    [C++프로그래밍] Gaussian(가우시안) 필터 알고리즘 개념과 소스

    반응형