diff --git a/include/workaround.hpp b/include/workaround.hpp index 18ffbc4..a8cc763 100644 --- a/include/workaround.hpp +++ b/include/workaround.hpp @@ -1,7 +1,13 @@ #pragma once class MatrixProcessor { - public: - void Threshold(unsigned char* const data, const int width, const int height, - const int threshold); +public: + void Threshold(unsigned char* const data, const int width, const int height, + const int threshold); + void AvrgElems(unsigned char* const data, const int width, const int height, const int locality); + void MedianFilter(unsigned char* const data, const int width, const int height, const int locality); + unsigned char Sum(unsigned char* const data, const int width, const int height, + const int a, const int b, const int locality); + unsigned char FindAverage(unsigned char* const data, const int width, + const int height, const int a, const int b, const int locality); }; diff --git a/src/workaround.cpp b/src/workaround.cpp index 2eba458..76db667 100644 --- a/src/workaround.cpp +++ b/src/workaround.cpp @@ -1,10 +1,87 @@ #include "workaround.hpp" #include - +#include using namespace std; void MatrixProcessor::Threshold(unsigned char* const data, const int width, - const int height, const int threshold) { - // TODO: Add thresholding logic here. + const int height, const int threshold) +{ + for (int i = 0; i < width*height; i++) + if (data[i] < threshold) + data[i] = 0; +} + +void MatrixProcessor::AvrgElems(unsigned char* const data, const int width, + const int height, const int locality) +{ + int ind; + unsigned char* tmpData = new unsigned char[width*height]; + for (int i = 0; i < height; i++) + for (int j = 0; j < width; j++) + { + ind = i * width + j; + tmpData[ind] = Sum(data, width, height, i, j, locality); + } + + for (int i = 0; i < width*height; i++) + data[i] = tmpData[i]; +} + +void MatrixProcessor::MedianFilter(unsigned char * const data, const int width, + const int height, const int locality) +{ + unsigned char* tmpData = new unsigned char[width*height]; + int ind = 0; + + for (int i = 0; i < height; i++) + for (int j = 0; j < width; j++) + { + ind = i * width + j; + tmpData[ind] = FindAverage(data, width, height, i, j, locality); + } + + for (int i = 0; i < width*height; i++) + data[i] = tmpData[i]; +} + +unsigned char MatrixProcessor::Sum(unsigned char * const data, const int width, + const int height, const int a, const int b, const int locality) +{ + int m = 0; + int sum = 0; + + for (int i = a - locality; i <= a + locality; i++) + for (int j = b - locality; j <= b + locality; j++) + { + if (i < 0 || i >= height || j < 0 || j >= width) + continue; + sum += data[i * width + j]; + m++; + } + + if (m == 0) throw "1"; + + return (unsigned char)(sum / m); +} + +unsigned char MatrixProcessor::FindAverage(unsigned char * const data, const int width, const int height, + const int a, const int b, const int locality) +{ + unsigned char* avrg = new unsigned char[(locality * 2 + 1)*(locality * 2 + 1)]; + int ind = 0; + + for (int i = a - locality; i <= a + locality; i++) + for (int j = b - locality; j <= b + locality; j++) + { + if (i < 0 || i >= height || j < 0 || j >= width) + { + continue; + } + avrg[ind++] = data[i * width + j]; + } + + std::sort(avrg, avrg + ind + 1); + + return avrg[(ind + 1) / 2]; } diff --git a/test/test_threshold.cpp b/test/test_threshold.cpp new file mode 100644 index 0000000..9cee582 --- /dev/null +++ b/test/test_threshold.cpp @@ -0,0 +1,38 @@ +#include +#include "workaround.hpp" +#include +TEST(MatProcess, test_threshold) +{ + unsigned char tmp[] = { 4,5,1,1,1,5,7,7,4 }; + MatrixProcessor pic; + + pic.Threshold(tmp, 3, 3, 3); + + EXPECT_EQ(0, tmp[2]); + EXPECT_EQ(0, tmp[3]); + EXPECT_EQ(0, tmp[4]); + +} + +TEST(MatProcess, test_averaging) +{ + MatrixProcessor pic; + unsigned char tmp[9]; + for (int i = 0; i < 9; i++) + tmp[i]= 1; + tmp[4] = 10; + pic.AvrgElems(tmp, 3, 3, 1); + EXPECT_EQ(3, tmp[0]); +} + +TEST(MatProcess, test_median_filter) +{ + unsigned char tmp[] = { 1,2,3,4,5,6,7,8,9 }; + MatrixProcessor pic; + + pic.MedianFilter(tmp, 3,3,1); + + EXPECT_EQ(4, tmp[0]); + + +} \ No newline at end of file