Сгенерируйте изображения мультфильма используя двустороннюю фильтрацию

В этом примере показано, как сгенерировать линии мультфильма и наложить их на изображение.

Двусторонняя фильтрация [1] используется в системах компьютерного зрения для фильтрации изображений при сохранении ребер и стала повсеместной в приложениях обработки изображений. Эти приложения включают в себя шумоподавление при сохранении ребер, разделение текстуры и освещения для сегментации и карикатуру или абстракцию изображения для улучшения ребер в квантованном изображении с уменьшенным цветом.

Двусторонняя фильтрация проста по концепции: каждый пиксель в центре микрорайона заменяется средним значением его соседей. Среднее значение вычисляется с помощью взвешенного набора коэффициентов. Веса определяются пространственным положением в окрестности (как в традиционном Гауссовом фильтре размытия) и различием интенсивности от центрального значения окрестности.

Эти два весовых коэффициента независимо контролируются двумя стандартными параметрами отклонения двустороннего фильтра. Когда стандартное отклонение интенсивности велико, двусторонний фильтр действует больше как Гауссов фильтр размытия, потому что интенсивность Гауссов менее пиковая. И наоборот, когда стандартное отклонение интенсивности меньше, ребра интенсивности сохраняются или усиливаются.

Эта модель примера предоставляет аппаратно совместимый алгоритм. Можно сгенерировать HDL-код из этого алгоритма и реализовать его на плате с помощью Xilinx™ Zynq™ исходного проекта. См. раздел «Двусторонняя фильтрация оборудования на основе Zynq» (Пакет поддержки Vision HDL Toolbox для оборудования на основе Xilinx Zynq).

Введение

Система BelateralFilterHDLExample.slx показана здесь.

modelname = 'BilateralFilterHDLExample';
open_system(modelname);
set_param(modelname, 'SampleTimeColors', 'on');
set_param(modelname,'SimulationCommand','Update');
set_param(modelname, 'Open', 'on');
set(allchild(0),'Visible', 'off');

Шаг 1: Установите значения параметров

Чтобы достичь скромного Гауссова размытия входов, выберите относительно большое пространственное стандартное отклонение 3. Чтобы придать сильный акцент ребрам изображения, выберите стандартное отклонение интенсивности 0,75. Интенсивность Гауссова построена из данных изображения в окрестностях, поэтому этот график представляет максимально возможные значения. Обратите внимание на небольшую вертикальную шкалу на пространственном Гауссовом графике.

figure('units','normalized','outerposition',[0 0.5 0.75 0.45]);
subplot(1,2,1);
s1 = surf(fspecial('gaussian',[9 9 ],3));
subplot(1,2,2);
s2 = surf(fspecial('gaussian',[9 9 ],0.75));
legend(s1,'Spatial Gaussian 3.0');
legend(s2,'Intensity Gaussian 0.75');

Настройки фиксированной точки

Для генерации HDL-кода необходимо выбрать тип данных с фиксированной точкой для коэффициентов фильтра. Тип коэффициента должен быть беззнаковым типом. Для двусторонней фильтрации входная область значений всегда принимается за интервал. $[0,1]$Поэтому a uint8 вход с областью значений значений от$[0,255]$ обрабатываются как. $$\frac{[0,255]}{255} $$Вычисленные значения коэффициентов меньше 1. Точные значения коэффициентов зависят от размера окрестности и стандартных отклонений. Большие окрестности распространяют Гауссову функцию таким образом, что каждое значение коэффициента меньше. Большее стандартное отклонение уплощает Гауссов, получая более равномерные значения, в то время как меньшее стандартное отклонение создает пиковую характеристику.

Если вы пробуете тип, и коэффициенты квантуются таким образом, что более половины ядра становится нулем для всех входных параметров, Bilateral Filter блок выдает предупреждение. Если все коэффициенты равны нулю после квантования, блок выдает ошибку.

Шаг 2: Фильтрация изображения интенсивности

Модель преобразует входящее изображение RGB в интенсивность с помощью блока Color Space Converter. Затем изображение интенсивности полутонового цвета отправляется в блок Belateral Filter, который конфигурируется для окрестности 9 на 9 и параметров, установленных ранее.

Двусторонний фильтр обеспечивает некоторое размытие Гауссова, но будет сильно подчеркивать большие ребра на изображении на основе размера окрестности 9 на 9.

open_system([modelname '/HDLAlgorithm'],'force');

Шаг 3: Вычислите Величину градиента

Затем блок Sobel Edge Detector вычисляет величину градиента. Поскольку изображение было предварительно отфильтровано с помощью двустороннего фильтра с довольно большим соседством, меньшие менее важные ребра на изображении не будут подчёркиваться во время обнаружения ребра.

Пороговый параметр для блока Sobel Edge Detector может быть получен из постоянного значения на маске блока или из порта. Блок в этой модели использует порт, чтобы позволить динамически устанавливать порог. Это пороговое значение должно быть вычислено для вашей конечной системы, но пока можно просто выбрать хорошее значение, наблюдая результаты.

Синхронизация вычисленных ребер

Чтобы наложить пороговые ребра на исходное изображение RGB, необходимо выровнять эти два потока. Задержка обработки двустороннего фильтра и детектора ребер означает, что пороговое ребро и входной поток пикселей RGB не выровнены во времени.

Блок Pixel Stream Aligner объединяет их. Поток пикселей RGB соединяется с верхним портом входа пикселя, и бинарный пиксель порога изображения соединяется с портом ссылки входа. Блок задерживает поток пикселей RGB, чтобы соответствовать потоку порога.

Необходимо задать количество линий параметра значение, которое позволяет задержать как двусторонний фильтр, так и детектор ребра. Двусторонний фильтр 9 на 9 имеет задержку более 4 линий, в то время как ребро детектор имеет задержку бита более 1 линии. Для безопасности установите Maximum number of lines до 10 на данный момент, чтобы вы могли попробовать различные размеры окрестностей позже. Как только ваш проект завершён, можно определить фактическое количество линий задержки, наблюдая формы сигналов управления.

Квантование цвета

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

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

Эти алгоритмы требуют, чтобы вы знали заранее все цвета в оригинальное изображение. В пиксельном потоковом видео этап обнаружения цвета вводит нежелательную задержку системы координат. Квантование цвета также, как правило, лучше всего выполнять в воспринимаемо равномерном цветовом пространстве, таком как L * a * b. Когда вы кластеризуете цвета в пространстве RGB, нет гарантии, что результат будет выглядеть показательно для человеческого средства просмотра.

The Quantize подсистема в этой модели использует намного более простую форму квантования цветов, основанную на наиболее значимых 4 битах каждого 8-битного цветового компонента. RGB тройки с 8-битными компонентами могут представлять до$2^{24} = 2^8 \cdot 2^8 \cdot 2^8$ цветов, но ни одно изображение не может использовать все эти цвета. Точно так же, когда вы уменьшаете количество бит на цвет до 4, изображение может содержать до$2^{12} = 2^4 \cdot 2^4 \cdot 2^4$ цветов. На практике изображение 4 бит в относительных цветах обычно содержит только несколько сотен уникальных цветов.

После перемены каждого цветового компонента вправо на 4 бита, модель сдвигает результат назад налево на 4 бита, чтобы сохранить 24-битный формат RGB, поддерживаемый средством просмотра видео. В системе HDL следующие шаги обработки будут проходить только на 4-битных цветных RGB тройках.

open_system([modelname '/HDLAlgorithm/Quantize'],'force');

Наложение ребер

Блок switch перекрывает ребра на оригинальное изображение, выбирая либо поток RGB, либо параметр RGB. Переключатель поворачивается на основе обнаруженного ребром бинарного изображения. Поскольку для мультфильма требуются сильные ребра, модель не использует альфа-миксер.

Синхронизация параметров

В сложение к пиксельным и управляющим сигналам в подсистему HDLAlgorithm входят два параметра: порог градиента и тройной RGB линии для цвета наложения. The FrameBoundary подсистема обеспечивает управление порогом и цветом линии во время выполнения. Однако, чтобы избежать выхода системы координат с комбинацией цветов или порогов, подсистема регистрирует параметры только в начале каждой системы координат.

open_system([modelname '/HDLAlgorithm/FrameBoundary'],'force');

Результаты симуляции

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

Генерация HDL-кода

Чтобы проверить и сгенерировать HDL-код, на который ссылаются в этом примере, необходимо иметь лицензию HDL- Coder™.

Чтобы сгенерировать HDL-код, используйте следующую команду.

makehdl('BilateralHDLExample/HDLAlgorithm')

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

makehdltb('BilateralHDLExample/HDLAlgorithm')

Часть модели между блоками Frame to Pixels и Pixels to Frame может быть реализована на FPGA. Подсистема HDLAlgorithm включает все элементы двустороннего фильтра, обнаружения ребер и наложения.

Дальнейший переход

Двусторонний фильтр в этом примере сконфигурирован, чтобы подчеркнуть большие ребра с размыванием небольших таковых. Чтобы увидеть обнаружение ребер и наложение без двусторонней фильтрации, щелкните правой кнопкой мыши блок Двусторонний фильтр и выберите Comment Through. Затем перезапустите симуляцию. Обновленные результаты показывают, что многие меньшие ребра обнаруживаются и в целом ребра намного шумнее.

Эта модель имеет много параметров, которыми вы можете управлять, таких как двусторонние стандартные отклонения фильтра, размер окрестности и пороговое значение. Размер окрестности управляет минимальной шириной подчеркнутых ребер. Меньшая окрестность приводит к подсветке большего количества небольших ребер.

Можно также управлять внешним видом выхода путем изменения цвета наложения RGB и квантования цвета. Изменение порога обнаружения ребер управляет силой ребер.

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

Заключение

Эта модель сгенерировала мультяшное изображение с помощью двусторонней фильтрации и генерации градиентов. Модель наложила мультяшные линии на версию исходного изображения RGB, которое было квантовано до меньшего количества цветов. Этот алгоритм подходит для реализации FPGA.

Ссылки

[1] Томази, К. и Р. Мандучжи. «Двусторонняя фильтрация для серых и цветных изображений». Шестая Международная конференция по компьютерному зрению, 1998 год.