C # Концепция параллельной обработки - PullRequest
2 голосов
/ 24 мая 2011

Я работаю над обработкой изображений на C # и реализую интегральную гистограмму. Я не буду вдаваться в подробности, но предположим, что у меня есть матрица MxN, и каждое значение ячейки является суммой себя и своего левого и верхнего соседа, минус соседний левый верхний угол. Это работает быстро, но я хочу сделать это быстрее для больших изображений или для обработки изображений в реальном времени.

matrix[i,j] += matrix[i-1,j] + matrix[i,j-1] - matrix[i-1,j-1];

Фактическая реализация:

for (int i = 0; i < width; i++)
            for (int j = 0; j < height; j++)
            {
                int left = 0, upper = 0, u_l_corner = 0;
                if (j - 1 >= 0)
                {
                    left = matrix[i, j - 1];
                }
                if (i - 1 >= 0)
                {
                    upper = matrix[i - 1, j];
                }
                if (j - 1 >= 0 && i - 1 >= 0)
                    u_l_corner = matrix[i - 1, j - 1];

                matrix[i, j] += left + upper - u_l_corner;
            }

Таким образом, расчет зависит от предыдущих значений ячеек. Поэтому не похоже, что это может быть реализовано параллельно (по крайней мере, для меня). Но все же, просто хочу убедиться, прежде чем идти дальше ..

Может ли этот алгоритм быть реализован параллельно с использованием Parallel.For или любого другого метода в C #? Если так, то простой пример высоко ценится, но если нет, то мне лучше поработать над поиском «алгоритма параллельной гистограммы изображений», если таковой существует.

Заранее спасибо.

1 Ответ

0 голосов
/ 24 мая 2011

Насколько мне известно, возможно сделать этот алгоритм параллельным, но я не вижу смысла в этом, если ваша матрица относительно мала (время обработки меньше нескольких миллисекунд).

Есливы очень заинтересованы в том, чтобы сделать этот алгоритм параллельным, вы могли бы разделить эту задачу на задачи точно "j" (количество элементов по оси "y").

Ключом к этому является запуск первого потока для вычисления точекпервый ряд этой матрицы ([i, 0]), затем запуск второго потока отложен - второй поток должен преследовать первый поток - никогда не должен обогнать предыдущий поток.

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