diff --git a/include/filters.hpp b/include/filters.hpp index c86c095..45df2e1 100644 --- a/include/filters.hpp +++ b/include/filters.hpp @@ -15,8 +15,7 @@ class Filters enum FILTERS_IMPLEMENTATIONS { OPENCV, - // Add your enum value here - // YOUR_NAME, + SEMICHEV, NUM_IMPLS }; diff --git a/src/filters_factory.cpp b/src/filters_factory.cpp index c977bf3..62e821e 100644 --- a/src/filters_factory.cpp +++ b/src/filters_factory.cpp @@ -1,17 +1,16 @@ #include "filters.hpp" Filters* createFiltersOpenCV(); -// Declare your implementation here -// Filters* createFiltersYourName(); + +Filters* createFiltersSemichev(); Filters* createFilters(FILTERS_IMPLEMENTATIONS impl) { switch (impl) { case OPENCV: return createFiltersOpenCV(); - // Add case for your implementation - // case YOUR_NAME: - // return createFiltersYourName(); + case SEMICHEV: + return createFiltersSemichev(); default: return 0; } diff --git a/src/filters_semichev.cpp b/src/filters_semichev.cpp new file mode 100644 index 0000000..743f87b --- /dev/null +++ b/src/filters_semichev.cpp @@ -0,0 +1,95 @@ +#include "filters.hpp" + +uchar* Sort(uchar* A, int N) +{ + return 0; +} + +class FiltersSemichev : public Filters +{ +public: + virtual void boxFilter(const Matrix &src, Matrix& dst, const int kSize = 3) + { + dst = Matrix(src.rows(),src.cols()); + int sdvig = kSize / 2; + double F = 1.0 / (kSize * kSize); + + for (int x = 0; x < src.cols(); x++) + for(int y = 0; y < src.rows(); y++) + { + double tmp = 0; + for (int i = 0 - sdvig; i <= sdvig; i++) + for (int j = 0 - sdvig; j <= sdvig; j++) + { + if (x + i < 0) + tmp += 0; + else + if (y + j < 0) + tmp += 0; + else + tmp += F * src[x+i][y+j]; + } + if (tmp > 255) tmp = 255; + dst[x][y] = tmp; + } + } + + virtual void filter2d(const Matrix &src, Matrix& dst, const Matrix &kernel) + { + dst = Matrix(src.rows(),src.cols()); + int kSize = kernel.cols(); + int sdvig = kSize / 2; + + for (int x = 0; x < src.cols(); x++) + for(int y = 0; y < src.rows(); y++) + { + dst[x][y] = 0; + for (int i = 0 - sdvig; i <= sdvig; i++) + for (int j = 0 - sdvig; j <= sdvig; j++) + { + if (x + i < 0) + if (y + j < 0) + dst[x][y] += kernel[i + sdvig][j + sdvig] * src[x-i][y-j]; + else + dst[x][y] += kernel[i + sdvig][j + sdvig] * src[x-i][y+j]; + else + if (y + j < 0) + dst[x][y] += kernel[i + sdvig][j + sdvig] * src[x+i][y-j]; + else + dst[x][y] += kernel[i + sdvig][j + sdvig] * src[x+i][y+j]; + } + } + } + virtual void median(const Matrix &src, Matrix &dst, const int kSize = 3) + { + /*uchar* intensity = new uchar[kSize*kSize]; + dst = Matrix(src.rows(),src.cols()); + int sdvig = kSize / 2; + + for (int x = 0; x < src.cols(); x++) + for(int y = 0; y < src.rows(); y++) + { + dst[x][y] = 0; + int k = 0; + for (int i = 0 - sdvig; i <= sdvig; i++) + for (int j = 0 - sdvig; j <= sdvig; j++) + { + if ((x + i >= 0) && (y + j >= 0)) + { + intensity[k] = src[x+i][y+j]; + } + } + + }*/ + } + virtual void SobelOx(const Matrix &src, Matrix &dst) + { } +}; + + +Filters* createFiltersSemichev() +{ + Filters* filters = new FiltersSemichev; + return filters; +} +