Участник:Nikkou/Фильтр Собеля
Описание параллельной реализации алгоритма фильтрации Собеля.
Автор: А.Г.Лыжов (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. Вторая - выполняет горизонтальную свертку каждого изображения. Третья - выполняет вертикальную свертку каждого изображения. Четвертая - комбинирует частичные результаты Пятая - записывает результат на диск.
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.