본문 바로가기
C++ 200제/코딩 IT 정보

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

by vicddory 2017. 1. 21.

[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(가우시안) 필터 알고리즘 개념과 소스

댓글