Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions include/workaround.hpp
Original file line number Diff line number Diff line change
@@ -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);
};
83 changes: 80 additions & 3 deletions src/workaround.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,87 @@
#include "workaround.hpp"

#include <cstddef>

#include <algorithm>
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];
}
38 changes: 38 additions & 0 deletions test/test_threshold.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include <gtest/gtest.h>
#include "workaround.hpp"
#include <iostream>
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]);


}