티스토리 뷰
목차
[C++프로그래밍] Gaussian(가우시안) 필터 알고리즘 개념과 소스
Gaussian 스무딩의 공식은 아래이고, C++프로그래밍 소스로 구현하면 그 아래처럼 됩니다.
[C++ Gaussian Filter 예제]
[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++ Gaussian Filter 예제]
어떤 그림에 적용하는지에 따라 달라질테니 위의 소스를 변경해 사용하시면 되겠습니다.
C++프로그래밍에 있어서 맹점은 컨테이너를 어떻게 다루느냐입니다. 컨테이너 다루는 소스에 따라 성능은 크게 차이납니다.
Gaussian C++프로그램 만들때도 마찬가지이니 가우시안 알고리즘 적용 코드를 최적화하는 방법도 필요해요.
[C++프로그래밍] Gaussian(가우시안) 필터 알고리즘 개념과 소스