Участник:Nikkou/Фильтр Собеля: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 77: Строка 77:


=== Информационный граф ===
=== Информационный граф ===
Первая группа вершин выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.
Вторая - выполняет горизонтальную свертку каждого изображения.
Третья - выполняет вертикальную свертку каждого изображения.
Четвертая - комбинирует частичные результаты
Пятая - записывает результат на диск.
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.
=== Ресурс параллелизма алгоритма ===
=== Ресурс параллелизма алгоритма ===
=== Входные и выходные данные алгоритма ===
=== Входные и выходные данные алгоритма ===

Версия от 16:45, 2 декабря 2017

Описание параллельной реализации алгоритма фильтрации Собеля.

Автор: А.Г.Лыжов (401 группа).

Свойства и структура алгоритма

Общее описание алгоритма

Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.

Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.

Математическое описание алгоритма

Исходные данные:

  • изображение [math]\displaystyle{ A^{N\cdot M} }[/math]

Вычисляемые данные:

  • матрица аппроксимации модуля градиента [math]\displaystyle{ G^{N\cdot M} }[/math]
  • матрица аппроксимации направления градиента [math]\displaystyle{ \Theta^{N\cdot M} }[/math]

Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.

Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:

[math]\displaystyle{ \mathbf{G}_x = \begin{bmatrix} +1 & 0 & -1 \\ +2 & 0 & -2 \\ +1 & 0 & -1 \end{bmatrix} * \mathbf{A} ,\ \mathbf{G}_y = \begin{bmatrix} +1 & +2 & +1\\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{bmatrix} * \mathbf{A} }[/math]

Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:

[math]\displaystyle{ \mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 } }[/math]

[math]\displaystyle{ \mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right) }[/math]

Вычислительное ядро алгоритма

Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за [math]\displaystyle{ O(M\cdot N) }[/math] на одном изображении.

Макроструктура алгоритма

Макроструктуру в основном составляют:

1) двумерные свертки, приведенные в математическом описании;

2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.

Эти элементы алгоритма приведены в разделе с математическим описанием.

Схема реализации последовательного алгоритма

Запись на C++-подобном псевдокоде:

float *sobel(float *img) {
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]
    horiz_der = conv(img, diff_kernel, sum_kernel);
    vert_der = conv(img, sum_kernel, diff_kernel);
    return combine_horiz_vert(horiz_der, vert_der);
}

for (int i = 0; i < n_images; i++) {
	img = get_input(i);
	res = sobel(img);
	write_result(res);
}

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

Последовательная сложность алгоритма

[math]\displaystyle{ O(M\cdot N \cdot K) }[/math] при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.

Информационный граф

Первая группа вершин выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K. Вторая - выполняет горизонтальную свертку каждого изображения. Третья - выполняет вертикальную свертку каждого изображения. Четвертая - комбинирует частичные результаты Пятая - записывает результат на диск.

Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.

Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.

Ресурс параллелизма алгоритма

Входные и выходные данные алгоритма

Свойства алгоритма

Программная реализация алгоритма

Особенности реализации последовательного алгоритма

Локальность данных и вычислений

Локальность реализации алгоритма

Структура обращений в память и качественная оценка локальности
Количественная оценка локальности

Возможные способы и особенности параллельной реализации алгоритма

Масштабируемость алгоритма и его реализации

Масштабируемость алгоритма

Масштабируемость реализации алгоритма

Динамические характеристики и эффективность реализации алгоритма

Выводы для классов архитектур

Существующие реализации алгоритма

Литература