граничные случаи в медианном фильтре (2D int) c ++ - PullRequest
0 голосов
/ 04 октября 2018

При разработке двумерного целочисленного медианного фильтра я столкнулся с проблемой при поиске медианы для граничных значений двумерного массива.

Мой код

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <math.h>
    #include <cilk/cilk.h>

    int median(int x1, int y1, int k);
    void recursion(int x1, int y1, int x2, int y2);

    using namespace std;

    std::vector < std::vector <int>> x;
    std::vector < std::vector <int>> y;

    int n, m, k;
    //n=y
    //m=x

    int main()
    {
        std::fstream File;
        File.open("test.txt");

        //error msg reading
        if (File.fail()) {
            cout << "error opening file";
        }

        //read file
        while (!File.eof())
        {
            File >> n;
            File >> m;
            File >> k;

            for (int i = 0; i < n; i++) {
                vector <int> row;
                for (int j = 0; j < m; j++) {
                    int readFromFile = 0;
                    File >> readFromFile;
                    row.push_back(readFromFile);
                }
                x.push_back(row);
            }

        }

        //print vector values to console to see if its correct
        cout << n; 
        cout << "\n";
        cout << m;
        cout << "\n";
        cout << k;
        cout << "\n";

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cout << x[i][j];
                cout << " ";
            }
            cout << "\n";
        }

        recursion (0,0,n,m);
    }

    void recursion(int x1, int y1, int x2, int y2)
    {
        int mDiv2=x2/2;
        int nDiv2=y2/2;

        if ((x2 == x1) && (y2 == y1))
        {
            y[x2][y2] = median(k);
            return;
        }
        else
        {
            cilk_spawn recursion(x1, y1, x2/2, y2/2); //quadrant 1
            cilk_spawn recursion(mDiv2, y1, x2/2, nDiv2/2); //quadrant 2
            cilk_spawn recursion(x1, nDiv2, mDiv2/2, y2/2); //quadrant 3
            cilk_spawn recursion(mDiv2, nDiv2, x2/2, y2/2); //quadrant 4
        }
    }

int median(int x, int y, int k)
{
    vector <int> s;

    for (int i = -k; i < k; i++) {
        for (int j = -k ; j < k; j++) {
            if (((x+i>=0) && (y+j>=0)) && ((x+i<=m) && (y+j>=n))){
            s.push_back(x[x+i][y+i]);}
            else
            {
                //boundary
            }
        }
    }
//sort
}

В пределах медианной функции я беру точку в двумерном массиве, сохраненном в векторе x вместе с фильтром медианы k.Если значение выходит за границы, я бы хотел сохранить значение ближайшего элемента.Например, точка (0,0) с k-медианным фильтром 3 будет собирать все данные от (-3, -3) до (3,3).Поскольку (-3, -3) не существует, ближайшим элементом будет (0,0), таким образом, сохраняя значение x [0] [0].Как бы вы присвоили значение ближайшего элемента для вектора s, если он выходит за границы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...