AlgoPlus v0.1.0
Loading...
Searching...
No Matches
median_filter.h
1#ifndef MEDIAN_FILTER_H
2#define MEDIAN_FILTER_H
3
4#ifdef __cplusplus
5#include <algorithm>
6#include <iostream>
7#include <vector>
8#include "../image.h"
9#endif
10
14namespace median_filter {
20inline void set_values(std::vector<int32_t>& values, const std::vector<std::vector<int32_t>>& mat) {
21 int height = mat.size(), width = mat[0].size();
22 int index = 0;
23 for (int x = 0; x < height; x++) {
24 for (int y = 0; y < width; y++) {
25 values[index++] = mat[x][y];
26 }
27 }
28}
29
37inline std::vector<std::vector<int32_t>>
38apply_median_filter(const std::vector<std::vector<int32_t>>& image) {
39 Image img(image);
40 int height = img._height();
41 int width = img._width();
42 Image resulted_img(height, width);
43 std::vector<std::vector<int32_t>> mask = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
44 std::vector<int32_t> values(9, 0);
45 for (int x = 0; x < height; x++) {
46 for (int y = 0; y < width; y++) {
47 mask[1][1] = img.get_point(x, y);
48 if (x - 1 >= 0 && y - 1 >= 0) {
49 mask[0][0] = img.get_point(x, y);
50 }
51 if (x - 1 >= 0) {
52 mask[1][0] = img.get_point(x - 1, y);
53 }
54 if (y - 1 >= 0) {
55 mask[0][1] = img.get_point(x, y - 1);
56 }
57 if (x + 1 < height && y - 1 >= 0) {
58 mask[2][0] = img.get_point(x + 1, y - 1);
59 }
60 if (x - 1 >= 0 && y + 1 < width) {
61 mask[0][2] = img.get_point(x - 1, y + 1);
62 }
63 if (y + 1 < width) {
64 mask[1][2] = img.get_point(x, y + 1);
65 }
66 if (x + 1 < height && y + 1 < width) {
67 mask[2][2] = img.get_point(x + 1, y + 1);
68 }
69 if (x + 1 < height) {
70 mask[2][1] = img.get_point(x + 1, y);
71 }
72 set_values(values, mask);
73 std::sort(values.begin(), values.end());
74 resulted_img.set_point(x, y, values[5]);
75 }
76 }
77 return resulted_img.get_2d_array();
78}
79} // namespace median_filter
80
81#endif
Definition image.h:13
int get_point(const int x, const int y) const
get_point function
Definition image.h:71
int _width() const
width function
Definition image.h:57
void set_point(int x, int y, int val)
set_point function
Definition image.h:78
std::vector< std::vector< int32_t > > get_2d_array() const
get_2d_array function
Definition image.h:63
int _height() const
_height function
Definition image.h:51
median_filter namespace
Definition median_filter.h:14
std::vector< std::vector< int32_t > > apply_median_filter(const std::vector< std::vector< int32_t > > &image)
apply_median_filter function: applies a 3x3 median filter on image img
Definition median_filter.h:38
void set_values(std::vector< int32_t > &values, const std::vector< std::vector< int32_t > > &mat)
set_values function
Definition median_filter.h:20