Отметим, что теоремы 1 и 2 для pi = p2 содержатся в работе [5].
Работа выполнена при поддержке РФФИ (грант № 16-01-00350).
СПИСОК ЛИТЕРАТУРЫ
1. Бесов О. В., Ильин В. П., Никольский С. М. Интегральные представления функций и теоремы вложения. М.: Наука, 1975.
2. Потапов М. К., Симонов Б. В. Свойства частного модуля гладкости положительного порядка в смешанной метрике // Современные проблемы математики и механики: Тр. мех.-мат. ф-та МГУ. Т. X. Математика. Вып. 1. К 60-летию семинара "Тригонометрические и ортогональные ряды". М.: Изд-во Попечительского совета мех.-мат. ф-та МГУ имени М.В. Ломоносова, 2014. 58-70.
3. Потапов М. К., Симонов Б. В. Свойства полного модуля гладкости положительного порядка в смешанной метрике // Современные проблемы математики и механики: Тр. мех.-мат. ф-та МГУ. Т. XI. Математика. Вып. 1. К 80-летию В.А. Скворцова. Обобщенные интегралы и гармонический анализ. М.: Изд-во Попечительского совета мех.-мат. ф-та МГУ имени М.В. Ломоносова, 2016. 76-91.
4. Potapov M. K., Simonov B. V., Tikhonov S. Yu. Mixed moduli of smoothness in Lp, 1 < p < то: A survey // Surveys in Approximation Theory. 2013. 8. 1-57.
5. Потапов М. К., Симонов Б. В., Тихонов С. Ю. Модули гладкости дробных порядков. М.: Изд-во Попечительского совета мех.-мат. ф-та МГУ имени М.В. Ломоносова, 2014.
6. Потапов М. К., Симонов Б. В., Тихонов С. Ю. Дробные модули гладкости. М.: Макс Пресс, 2016.
7. Potapov M. K., Simonov B. V., Tikhonov S. Yu. Constructive characteristics of mixed moduli of smoothness of positive orders // Proc. 8th Congress of the International Society for Analysis, its Applications, and Computation (August 22-27, 2011). Progress in analysis. Moscow: Peoples Friendship University of Russia, 2012. Vol. 2. 314-325.
8. Butzer P. L., Dyckhoff H., Gorlich E., Stens R. L. Best trigonometric approximation fractional order derivatives and Lipchits classes // Can. J. Math. 1977. XXIX, N 4. 781-793.
9. Бессонов Ю. Л. О существовании смешанных производных дробного порядка в Lp // Успехи матем. наук. 1964. XIX, вып. 4(118). 163-170.
10. Потапов М. К., Симонов Б. В. Полные модули гладкости положительных порядков функций из пространств Lp, 1 < p < то // Современные проблемы математики и механики: Тр. мех.-мат. ф-та МГУ. Т. X. Математика. Вып. 2. К 100-летию Лузинского семинара по теории функций. М.: Изд-во Попечительского совета мех.-мат. ф-та МГУ имени М.В. Ломоносова, 2015. 101-133.
11. Никольский С. М. Приближение функций многих переменных и теоремы вложения. М.: Наука, 1977.
12. Унинский А. П. Неравенства в смешанной норме для тригонометрических полиномов и целых функций конечной степени // Мат-лы Всесоюз. симп. по теоремам вложения. Баку, 1966. 212-213.
13. Симонов Б. В. Смешанные модули гладкости в смешанных метриках // Матем. заметки. 2012. 92, № 5. 747-761.
Поступила в редакцию 24.01.2018
УДК 511
РЕАЛИЗАЦИЯ БЫСТРОГО АЛГОРИТМА ГЕОМЕТРИЧЕСКОГО КОДИРОВАНИЯ ЦИФРОВЫХ ИЗОБРАЖЕНИЙ С ПРИМЕНЕНИЕМ АРХИТЕКТУРЫ CUDA
А. Ю. Чекунов1
В работе сравниваются скорость и качество реализации быстрого алгоритма распознавания контуров, основанного на геометрическом кодировании, c широко используемой реализацией алгоритма Кэнни распознавания контуров из открытой библиотеки компьютерного зрения OpenCV (Open Source Computer Vision Library) с применением параллельной архитектуры CUDA (Compute Unified Device Architecture). Сравнение показывает, что
1 Чекунов Алексей Юрьевич — асп. каф. дифференциальной геометрии и приложений мех.-мат. ф-та МГУ, e-mail: alexey. chekunov@mail .ru.
разработанный алгоритм геометрического кодирования не уступает, а в некоторых случаях превосходит по скорости и качеству выделения границ алгоритм Кэнни. Представлены примеры работы алгоритма геометрического кодирования в различных ситуациях.
Ключевые слова: распознавание образов, геометрическое кодирование, кодирующая поверхность, контурный анализ, распознавание контуров, компьютерное зрение, обработка изображений, склейка изображений.
In this paper we compare the speed and quality of CUDA realization for new contour detection algorithm based on geometrical coding with CUDA implementation of Canny algorithm which is commonly used in OpenCV library. The comparison shows that the new approach can really compete with the Canny operator and in some cases even overcome it in speed and quality. Examples of geometrical coding contour detection in different situations are presented.
Key words: pattern recognition, geometrical coding, coding surface, contour analysis, edge detection, computer vision, image processing, image stitching.
Введение. Одной из важнейших задач современной компьютерной геометрии является обработка цифровых изображений. Во многих случаях первичный анализ изображений начинается с распознавания контуров (границ). В настоящее время существует огромное количество алгоритмов, позволяющих выполнять эту задачу. Одним из наиболее известных и быстрых является алгоритм Кэнни (J. Canny) [1]. Недавно Г. В. Носовским был предложен новый метод (см. [2, 3]): цветное или черно-белое (в оттенках серого) изображение представляется (без потери цветовой информации) в виде двумерной поверхности в R3 (кодирующая поверхность), после чего анализ изображения осуществляется методами дифференциальной геометрии на кодирующей поверхности с помощью метрического тензора и главных кривизн, а не градиентов интенсивности и гессианов, которые обычно используются при распознавании контуров изображений (см. рис. 1).
Рис. 1. Цифровое изображение ^ кодирующая поверхность ^ распознавание контуров с помощью
алгоритма геометрического кодирования
К основным преимуществам нового метода относятся: 1) обработка полной цветовой информации (в предыдущих подходах цвета на первоначальном этапе не учитывались); 2) минимальный набор числовых параметров, которые пользователь должен выбрать и настроить; 3) гибкость: существует простой способ создания различных инструментов для разных классов приложений без изменения самого алгоритма — путем выбора соответствующей базовой скалярной функции в зависимости от метрического тензора и/или главных кривизн кодирующей поверхности.
Еще одним важным преимуществом является низкая вычислительная сложность метода геометрического кодирования: требуется меньше операций на точку по сравнению с традиционными методами [2]. Но когда речь идет о параллельных вычислениях на современных компьютерах с использованием графических видеокарт, заранее не ясно, будет ли новый метод работать быстрее. Это в большей степени зависит от его возможности соответствовать современной архитектуре "центральный процессор (далее CPU) — графическая карта (далее GPU)".
Анализ алгоритма геометрического кодирования. Как правило, контуры представляют собой линии, которыми разделяются области изображения со значительно отличающимися величинами цвета или интенсивности. На поверхности кодирования такие линии отражаются зонами метрической деформации [2]. Таким образом, проблема обнаружения контуров изображений сводится к проблеме нахождения растяжений или сжатий на такой поверхности. Для решения этой проблемы выполним следующие шаги [3].
1) Определим скалярную функцию на поверхности кодирования S, зависящую от двух главных
кривизн или от метрического тензора в точке х € 5 таким образом, что значение этой функции возрастает вдоль складок или в точках растяжения.
2) Рассмотрим множество точек А С 5 на поверхности кодирования 5, определяемое условием А = {х : /(х) > а}, где / — некоторая скалярная функция и а — порог, который вычисляется автоматически с помощью фрактальной размерности результирующего набора А. В этом случае для соответствующего выбора функции / и порога а множество А образует диаграмму на поверхности кодирования, проекция которой на плоскость изображения формирует контурный рисунок. Разумеется, детали контуров, выделенных с помощью такой процедуры, зависят от выбора функции /, но общий результат оказывается одинаковым. Используя разные функции /, мы можем получать разные контурные рисунки — более или менее подробные, более или менее художественные.
3) Рассмотрим некоторые примеры функций, которые использовались в настоящей работе:
/g(AI,A2) = c||Ai|-|A2||,
/i(Al ,A2) = c|Amax1 /Amin,
/2(Ai, A2) = c(Ai - A2)2 = c(H2 - 4K), /s(Ai, A2) = c(Al - A2)2 = cH2(H2 - 4K),
хл лх I 1X142 ic(H2 - 4K), K > 0; /4 (Ai, A2) = c(|Ai | — | A21)2 = \ '
[cH2, K < 0,
(\2 \2)2 \2 \2 MAi, A2) = = Я2(Я2 - 4K)/K* = ± + - 2,
/a(Ai ,A2) =
a2 x a2 a2 Ai (|Ai|-|A21)2 il - 4K/H2, K ^ 0;
H2 [1, K< 0,
(Ai + A2)3 _ H3
/7(Ai ,A2) =
Ai x A2 K2,
hi(fci,fc2) = G,
-I:
, ,, n {ki + fc2)2
hi{ki,k2) = —-г-,-•
kik2
Здесь c — числовой коэффициент; G — определитель первой фундаментальной формы; fci,fc2 — ее собственные значения; Ai, А2 — главные кривизны; H = Ai + А2 — средняя кривизна; K = Ai х А2 — гауссова кривизна; Amax, Amin — главные кривизны максимальной и минимальной величин.
Функции /2, /з, /4, /5, /б, /7 суть дробно-рациональные выражения от H и K. Напомним, что H и K являются в свою очередь рациональными выражениями, состоящими из матричных элементов первой и второй фундаментальных форм, а для вычисления главных кривизн требуется извлечение квадратного корня.
Функция /7 ведет себя аналогично функции /i. Действительно, если Amin значительно меньше по абсолютной величине, чем Amax, то Ai + А2 = Amax + Amin ^ Amax и, следовательно, /7(Ai, А2) « /i(Ai, А2). Для функции /7 вычисления проводятся быстрее, чем для функции /i, поэтому она может быть использована вместо /i.
Функции /5,/б суть однородные функции относительно Ai,A2, поэтому их расчет не требует нормализации вектора нормали к кодирующей поверхности.
Особенности реализации алгоритма геометрического кодирования. Напомним, что реализация алгоритма геометрического кодирования представляет собой программу, написанную на языке программирования С++ с применением параллельной архитектуры CUDA. Для корректной работы должны быть установлены:
компилятор С++;
CUDA Toolkit версии не ниже 7.5;
библиотека OpenCV версии не ниже 3.0.0 с поддержкой CUDA.
На первом шаге исходное цифровое изображение загружается из файла. Программа допускает возможность обработки изображений следующих форматов: .jpg, .jpeg, .bmp, .png, .tiff. Процедура загрузки изображения осуществляется с помощью стандартной функции из библиотеки OpenCV: Mat imread (const String& filename, int flags). Описание параметров функции: filename — полное имя загружаемого файла; flags — формат загрузки изображения.
Обрабатываемое изображение загружается как цветное, если flags = CV_LOAD_IMAGE_COLOR, причем цветовая информация хранится в виде трех R-G-B каналов. Поскольку каждый канал содержит значение в диапазоне от 0 до 255, то на хранение трех каналов потребуются 3 байта. Для оптимального обращения к памяти будем добавлять дополнительный четвертый а-канал. Итак, для хранения информации о цвете пикселей входного изображения будем использовать тип данных uchar4, размер которого составляет 4 байта.
Обрабатываемое изображение загружается в оттенках серого, если flags = CV_LOAD_IMAGE_GRAYSCALE, причем каждому пикселю соответствует только один канал вне зависимости от цветового пространства исходного изображения (в случае обработки цветного изображения с помощью специальных функций цветовые каналы преобразуются в оттенки серого). Таким образом, для хранения оттенков серого будем использовать тип данных uchar размером 1 байт.
Следующим шагом программы является передача данных с CPU на GPU. Предварительно выделим на графической карте глобальную память (global memory), чтение и запись в которой обрабатываются с помощью специальной памяти — Li cache (используется GPU версии 2.1 микроархитектуры Fermi). Для достижения высокой производительности данные необходимо копировать асинхронно независимыми друг от друга частями, при этом обработанные данные можно использовать, не дожидаясь окончания копирования. Следующая стандартная функция асинхронно передает данные с CPU на GPU и обратно:
cudaMemcpyAsync(void* dst, void* src, size_t count, enum cudaMemcpyKindkind, cudaStream_t stream).
Описание параметров функции:
dst — адрес целевой памяти;
src — адрес исходной памяти;
count — размер в байтах для копирования;
kind — тип передачи данных;
stream — идентификатор потока (по умолчанию stream = 0, если не указано другое значение). Заметим, что для успешной работы данной функции параметр src должен ссылаться на специальную "закрепленную" в CPU память (pinned memory). В данной реализации этот вид памяти выделяется с помощью следующей функции: cudaMallocHost (void ** ptr, size_t size). Описание параметров функции: ptr — указатель на выделенную память; size — требуемый размер выделения в байтах.
Выполнив первые три шага алгоритма из [3] с помощью специальных ядер CUDA, получим "грубое" изображение и вычислим значения одной из функций f- или h-типа по найденным значениям первых и вторых производных кодирующей поверхности для каждой его точки. Здесь во всех вычислениях используется глобальная память GPU как наиболее оптимальная память в случае, когда к каждому элементу обращаются ровно один раз.
Заметим, что в ходе вычисления значений выбранной функции для каждой точки можно быстро получить гистограмму распределения значений этой функции на "грубом" изображении следующим образом.
Шаг 1: округлим значения функций f- или h-типа до целых чисел. Заметим, что полученный числовой набор автоматически ограничен снизу ввиду неотрицательности всех функций, за исключением функции fj. Выберем довольно большое число N, ограничивающее числовой набор сверху таким образом, что оставшаяся выборка значений составляет примерно 90% от количества первоначальных значений. Так, например, для однородной функции h достаточно положить N = 256.
Шаг 2: создадим M локальных гистограмм, каждая из которых представляет собой массив размера N. Заполнение происходит следующим образом: будем увеличивать счетчик на 1 для эле-
то м £i £2
50 - 150 16 1 16
150 - 1000 32 2 32
1000 - 2000 64 2 64
2000 - 5000 128 4 128
> 5000 256 4 256
ментов локальных гистограмм с номерами, совпадающими со значениями из усеченного числового набора, причем i-му элементу матрицы "грубого" изображения соответствует локальная гистограмма с номером, равным остатку от деления i на M. Пройдя по всем элементам один раз, получим M локальных гистограмм распределения значений усеченного числового набора. Этот шаг Таблица1 является частью ядра CUDA, выполняющегося на GPU.
Пусть т = min(width, height) — функция минимума от ширины (width) и высоты (height) "грубого" изображения. Тогда значение M подбирается автоматически в зависимости от значений функции m в пикселях (см. табл. 1).
Шаг 3: построим глобальную гистограмму распределения, представляющую собой массив размера N, из M локальных гистограмм следующим образом: г-й элемент глобальной гистограммы будет содержать сумму i-х элементов M локальных гистограмм.
Шаг 4: вычислим квантили распределения значений усеченного числового набора, соответствующего значениям выбранной функции /- или Л,-типа. Будем искать квантили вида jfj, где п лежит в диапазоне от 1 до N.
Шаги 3 и 4 оптимальнее выполнять на CPU, исходя из особенностей параллельной архитектуры CUDA.
Отметим, что нахождение глобальной гистограммы по "грубому" изображению для последующего ее применения к исходному изображению помогает уменьшить вычислительные затраты алгоритма в целом.
Особое внимание уделим процедуре нахождения фрактальной размерности Минковского при автоматической пороговой фильтрации изображения. Это вычисление быстро производится с помощью известного алгоритма box counting подсчета ячеек [4].
Напомним, что размерность Минковского ограниченного множества в метрическом пространстве вычисляется по формуле
Fracbc = lim
e^Q
lniVo(e) ln(i)
lim
e^Q
lniVo(e) -ln(e) :
(1)
где No (б) — минимальное количество множеств размера е (в случае шаров — диаметра), которыми можно покрыть исходное множество.
Опишем подробнее алгоритм box counting. В качестве ограниченного множества в метрическом пространстве можно рассмотреть цифровое изображение, представляющее собой матрицу из конечного набора числовых значений. Затем нарисуем на изображении равномерную сетку с шагом е и закрасим те ячейки, которые содержат хотя бы один элемент первоначального множества. Уменьшая размер е, в пределе получим значение размерности для данного изображения, вычисляемое по формуле (1).
Более формально: если записать определение размерности Минковского, опустив предел, то с помощью несложных выкладок можно получить
Fracke = lim Ртас^ х ln(-) - lnN0(e) = 0.
е->o ln( —J е
(2)
Если рассматривать величину Fracbc при фиксированных значениях е, имитируя путем последовательных итераций предел, стремящийся к нулю, то можно считать выражение (2) уравнением прямой с угловым коэффициентом, равным приближенному значению размерности Минковского. Построив линию регрессии для полученных данных, применим метод наименьших квадратов и найдем данную аппроксимацию.
Для быстрого подсчета количества элементов, попавших в ячейку размера е, используется шаблон функции из библиотеки Thrust для CUDA:
template<typename InputIterator, typename EqualityComparable>
thrust::iterator_ traits<InputIterator>::difference_ type thrust::count
(InputIterator first, InputIterator last, const EqualityComparable& value).
Основные параметры функции:
first — начало последовательности;
end — конец последовательности;
value — значение, которое необходимо подсчитать.
Для повышения производительности при вычислении размерности Минковского достаточно выбрать две удаленные друг от друга точки, по которым можно построить искомую аппроксимацию. Заметим, что размер ячеек ei и для таких точек зависит от размеров обрабатываемого изображения. В таблице 1 представлены оценки для ei и e2 в пикселях в зависимости от значений функции m.
В случае вычисления первых (при необходимости вторых) производных в каждой точке исходного изображения применяется быстрая разделяемая память (shared memory). Так как данный тип памяти имеет область видимости "в пределах блока" для всех его потоков, то заполнение из глобальной памяти будет происходить следующим образом.
Шаг 1: для блока размером n х m внутри ядра CUDA создается дополнительная матрица с целью хранения разделяемой памяти размером (n + 2r) х (m + 2r) для локальной окрестности (2r + 1) х (2r + 1) каждой точки исходного изображения. В настоящей работе рассматривались значения r = 1, 2, 3. Оптимальные по скорости результаты достигаются при r = 1, n = 8 и m = 32.
Шаг 2: подготовленная на предыдущем шаге матрица разделяемой памяти заполняется из матрицы для исходного изображения с помощью техники объединенных запросов к глобальной памяти (coalesced memory).
С помощью разделяемой памяти осуществляется быстрое вычисление значений производных в каждой точке исходного изображения. Результат сохраняется в глобальной памяти на GPU.
С помощью ядер CUDA выполним последний четвертый шаг алгоритма из [3] по нахождению контуров исходного цифрового изображения. Передача данных с GPU на CPU осуществляется асинхронно с помощью описанной выше функции cudaMemcpyAsync. Полученный результат можно выгрузить в файл с расширением .jpg, .jpeg, .bmp и .png с помощью стандартной функции из библиотеки OpenCV:
bool imwrite (const String& filename, InputArray img, const vector<int>& params = vector<int>()).
Основные параметры функции:
filename — полное имя выгружаемого файла;
img — сохраняемое изображение;
params — формат сохраняемого изображения.
Заметим, что в обеих реализациях полученная картина контуров представляет собой однока-нальное изображение, поэтому передача данных с GPU на CPU занимает одинаковое время и в дальнейшем рассматриваться не будет.
Сравнение скорости работы алгоритмов. В настоящее время существует множество различных реализаций и улучшений алгоритма Кэнни на GPU (см. [5-8]). Сравним скорости работы реализации алгоритма геометрического кодирования и алгоритма Кэнни с применением CUDA.
Из-за того что реализация алгоритма Кэнни с применением CUDA обрабатывает только изображения в оттенках серого, будем проводить сравнение с двумя версиями нашего алгоритма — оригинальной цветной, которая обрабатывает цифровые изображения без потери цветовой информации, и новой версией, работающей только с изображениями в оттенках серого.
Запуск реализации алгоритма Кэнни с применением CUDA осуществляется с помощью следующего метода класса cv::cuda::CannyEdgeDetector библиотеки OpenCV:
virtual void cv::cuda::CannyEdgeDetector::detect (InputArray image, OutputArray edges). Описание параметров метода:
image — оригинальное изображение (цветное или в оттенках серого); edges — одноканальное изображение с результирующей картиной контуров. Описание параметров класса cv::cuda::CannyEdgeDetector: threshl — нижний порог для процедуры постобработки контуров; thresh2 — верхний порог для процедуры постобработки контуров; aperSize — размерность маски для нахождения производных;
L2grad — флаг, устанавливающий возможность выбора более точной нормы L2, если L2grad = true, или стандартной нормы L1, если L2grad = false.
В наших вычисления используются следующие значения описанных выше параметров: threshl = 100,0; thresh2 = 150,0; aperSize = 3; L2grad = false.
Все вычисления были произведены на стационарном персональном компьютере со следующей конфигурацией:
CPU: Intel(R) Core(TM) i7 CPU 2600K (34 GHz), 16 GB RAM; GPU: NVIDIA Geforce GTX 560 Ti; OpenCV version: 3.2.0.
Спецификации GPU:
Device: Geforce GTX 560 Ti;
CUDA Driver Version: 7.5;
CUDA Capability version number: 2.1;
OpenCL version: 1.2;
Total amount of global memory: 1536 MB;
Streaming multiprocessors (SM) x (Cores / SM) = CUDA Cores: 8 x 48 = 384; Total amount of shared memory per SM: 48 KB; Warp size: 32.
Были обработаны десятки цифровых изображений с различными разрешениями: 3264 x 2448, 4000 x 2672, 5616 x 3744, 8000 x 4672, 10000 x 4558.
Таблица2
Размер Алгоритм Новый алгоритм Новый алгоритм
изображения Кэнни (цветная версия) (оттенки серого)
3264 х 2448 16 15 (1,06) И (1,45)
4000 х 2672 22 22 (1,0) 15 (1,47)
5616 х 3744 37 37 (1,0) 25 (1,48)
8000 х 4672 61 62 (0,98) 38 (1,6)
10000 х 4558 81 82 (0,99) 47 (1,72)
В таблице 2 указано среднее время обработки в миллисекундах без учета этапов загрузки и выгрузки данных. В скобках указывается коэффициент, равный отношению скорости работы алгоритма Кэнни к скорости работы соответствующей версии алгоритма геометрического кодирования.
Обработка цветных изображений. В этом случае алгоритм геометрического кодирования считывает три цветовых канала (R-G-B) в каждой точке изображения. Затем с помощью шины PCI Express информация передается с CPU на GPU, где обрабатывается посредством специальных подпрограмм — ядер CUDA. Результирующая картина контуров представляется в виде одноканального изображения той же размерности, которое передается обратно с GPU на CPU по той же самой шине данных.
Для реализации алгоритма Кэнни требуется меньше времени на передачу данных с CPU на GPU, так как для каждого пикселя изображения передается только один канал (значение оттенка серого) вместо трех (R-G-B) в случае нашего алгоритма. Однако в настоящее время существуют более быстрые аналоги шины данных PCI Express, которые позволяют свести разницу в производительности на этапе передачи данных к нулю.
Несмотря на это, реализация цветной версии алгоритма геометрического кодирования показывает сравнимое с реализацией алгоритма Кэнни (обе с применением CUDA) время обработки изображений. Результаты экспериментов представлены в табл. 2.
Заметим, что чем больше размер изображения, тем меньше прирост производительности для реализации цветной версии алгоритма геометрического кодирования, так как необходимо передавать больше данных через шину PCI Express.
Обработка изображений в оттенках серого. В этом случае передача данных с CPU на GPU занимает одинаковое время, поскольку алгоритмы обрабатывают изображения в оттенках серого. Ввиду того что в новой версии алгоритма геометрического кодирования не тратится дополнительное время на передачу трех цветовых каналов каждой точки изображения, ее реализация существенно обгоняет по скорости реализацию алгоритма Кэнни (обе с применением CUDA) на всех исследуемых изображениях. Результаты экспериментов представлены в табл. 2.
Заметим, что чем больше размер обрабатываемого изображения, тем существеннее прирост производительности для реализации новой версии алгоритма в оттенках серого, что является дополнительным преимуществом в эпоху развития изображений высокого разрешения.
Сравнение качества работы алгоритмов. Приведем несколько показательных примеров работы алгоритма геометрического кодирования в сравнении с результатами, полученными с помощью алгоритма Кэнни.
В [2,3] показано, как функции f - и h-типа справляются с задачей распознавания контуров цифровых изображений в различных ситуациях. Основные примеры были представлены для функций hi,h2,h3, а также для некоторых функций f-типа. Заметим, что функция f4, как было отмечено в [3], удваивает линии контуров.
На всех изображениях продемонстрированы картины "точных" контуров, т.е. контуров, полученных непосредственно из всех пикселей исходного изображения. Примеры "грубых" контуров,
полученных путем замены пикселей исходного изображения на пиксельные блоки 3 х 3 со значениями, усредненными по этим блокам, были приведены в [3] и в настоящей статье рассматриваться не будут.
Рис. 2. Пример изображения с мелкими деталями: а — оригинальное изображение; б — контуры, полученные с помощью алгоритма Кэнни; в-е — контуры, полученные с помощью алгоритма геометрического
кодирования с функциями /4, к-1, к-2, кз соответственно
На рис. 2 показан пример сложного изображения с мелкими деталями: исходное цветное изображение; контуры, полученные с помощью алгоритма Канни; контуры, полученные с помощью
цветной версии алгоритма геометрического кодирования. Заметим, что некоторые детали на картине контуров Кэн-ни изображены недостаточно четко (б), в то время как функции Л,-типа наиболее качественно выделяют картины контуров, а функция Н3 дает лучший результат (е). В дальнейших примерах будем использовать только функцию Н3.
В работе [3] было показано, что функции Л,-типа могут распознавать контуры изображения, состоящего из двух областей разного цвета, но одинаковой интенсивности. На рис. 3 представлен пример такого изображения: черный круг расположен на сером фоне (а), причем при переходе к оттенкам серого получается однородное поле (б). Заметим, что алгоритм Кэнни не
может выделить границу раздела нарисованных областей: получается белый фон (в), в то время как цветная версия алгоритма геометрического кодирования без труда справляется с данной задачей (г). Приведенный пример показывает важность обработки цифровых изображений без потери цветовой информации.
Рис. 3. Пример изображения, состоящего из двух областей разного цвета, но одинаковой интенсивности: а-б — оригинальное изображение в цвете и в оттенках серого соответственно; в — контуры, полученные с помощью алгоритма Кэнни; г — контуры, полученные с помощью цветной версии алгоритма геометрического кодирования
Рис. 4. Пример "зашумленного" изображения, содержащего текстовые элементы: а — оригинальное изображение; б — контуры, полученные с помощью алгоритма Кэнни; в — контуры, полученные с помощью
алгоритма геометрического кодирования
Следующий пример демонстрирует возможность алгоритма геометрического кодирования распознавать текст на "зашумленном" изображении. Здесь алгоритм Кэнни сталкивается с проблемой: при неизменных параметрах алгоритм плохо выделяет границы букв на фоне шума. Это говорит о
а
Рис. 5. Пример репродукции картины: а — оригинальное изображение; б — контуры, полученные с помощью алгоритма Кэнни; в — контуры, полученные с помощью алгоритма геометрического кодирования
том, что параметры алгоритма Кэнни не являются гибкими по отношению к обрабатываемым изображениям, т.е. необходимо индивидуально подбирать оптимальные настройки для каждого изображения, в отличие от алгоритма геометрического кодирования, автоматически подбирающего нужный порог.
С помощью динамического подбора порога новый алгоритм позволяет оптимально подавлять шум и делать читаемым текст на изображении. Подтверждающий пример представлен на рис. 4: алгоритм Кэнни плохо выделяет границы букв (б), алгоритм геометрического кодирования успешно справляется с данной задачей (в).
Заключительный пример относится к распознаванию контуров знаменитой репродукции картины "Сад земных наслаждений" И. Босха, представленной на рис. 5. Картина содержит множество мелких элементов — людей, животных, различных предметов. Заметим, что новый алгоритм геометрического кодирования распознает мелкие детали лучше, чем алгоритм Кэнни (см. б, в).
Заключение. Наши расчеты показывают, что новый алгоритм анализа изображений и обнаружения контуров, основанный на геометрическом кодировании, в самом начале его разработки уже сопоставим по скорости и качеству с самыми известными, высокоразвитыми и быстрыми алгоритмами. Алгоритм геометрического кодирования, в основе которого лежат новые принципы, имеет хорошие перспективы дальнейшего развития. Он может стать полезным инструментом для анализа изображений, особенно в том случае, когда цветовая информация имеет значение.
Работа выполнена при поддержке программы Президента РФ "Ведущие научные школы РФ" (грант НШ-6399.2018.1) и РФФИ (грант № 16-01-00378-а).
СПИСОК ЛИТЕРАТУРЫ
1. Canny J. A computational approach to edge detection / IEEE Transactions on Pattern Analysis and Machine Intelligence. 1986. 8. 679-714.
2. Носовский Г.В. Геометрическое кодирование цветных изображений // Вестн. Моск. ун-та. Матем. Механ. 2018. № 1. 3-11.
3. Носовский Г.В., Чекунов А.Ю., Подлипаев С.А. Быстрый алгоритм геометрического кодирования цифровых изображений // Вестн. Моск. ун-та. Матем. Механ. 2017. № 6. 20-27.
4. Li J. Q., Sun D. C. An improved box-counting method for image fractal dimension estimation // Pattern Recognition. 2009. 42, N 11. 2460-2469.
5. Roodt Y., Visser W., Clarke W. Image processing on the GPU: Implementing the Canny edge detection algorithm // Int. Symp. of the Pattern Recognition Association of South Africa. Pietermaritzburg, 2007. 45-50.
6. Luo Y., Duraiswami R. Canny edge detection on NVIDIA CUDA // IEEE Comput. Soc. Conf. on Computer Vision and Pattern Recognition Workshops. CVPRW'08. Anchorage, Alaska, 2008.
7. Ogawa K., Ito Y., Nakano K. Efficient Canny edge detection using a GPU // Int. Conf. on Networking and Computing (ICNC). Higashi-Hiroshima, 2010. 279-280.
8. Niu S., Yang J., Wang S., Chen G. Improvement and parallel implementation of Canny edge detection algorithm based on GPU // IEEE 9th Int. Conf. on ASIC (ASICON). October 25-28. Xiamen, China, 2011. 641-644.
Поступила в редакцию 14.02.2018
УДК 517.98, 517.51
ФРЕЙМЫ ПАРСЕВАЛЯ ИЗ ПОСЛЕДОВАТЕЛЬНЫХ СДВИГОВ ОДНОЙ ФУНКЦИИ В ПРОСТРАНСТВАХ ТРИГОНОМЕТРИЧЕСКИХ МНОГОЧЛЕНОВ
А. В. Фадеева1
В работе доказан критерий существования фрейма Парсеваля наперед заданной размерности, полученного последовательными сдвигами одного многочлена в пространстве тригонометрических многочленов вида Тд(ж) = ^ вкегкх, где е^ £ С, а Q — конечное
кея
1 Фадеева Анна Вадимовна — студ. каф. математического анализа мех.-мат. ф-та МГУ, e-mail: annafadeeva16@mail. ru.