В этом примере показано, как создавать линии мультфильмов и накладывать их на изображение.
Двусторонняя фильтрация [1] используется в системах компьютерного зрения для фильтрации изображений с сохранением краев и стала повсеместной в приложениях обработки изображений. Эти приложения включают в себя деноизирование с сохранением краев, разделение текстуры и освещения для сегментации и карикатуру или абстракцию изображения для улучшения краев в квантованном изображении с уменьшенным цветом.
Двусторонняя фильтрация по понятию проста: каждый пиксель в центре окрестности заменяется средним значением его соседей. Среднее значение вычисляется с использованием взвешенного набора коэффициентов. Веса определяются пространственным расположением в окрестности (как в традиционном гауссовом фильтре размытия) и разностью интенсивности от значения центра окрестности.
Эти два весовых коэффициента независимо управляются двумя стандартными параметрами отклонения двустороннего фильтра. Когда стандартное отклонение интенсивности велико, двусторонний фильтр действует скорее как фильтр размытия Гаусса, потому что интенсивность Гаусса меньше пика. И наоборот, когда стандартное отклонение интенсивности меньше, края интенсивности сохраняются или улучшаются.
В этом примере модели представлен аппаратно совместимый алгоритм. Вы можете сгенерировать код HDL из этого алгоритма и осуществить его на правлении, использующем справочный дизайн Xilinx™ Zynq™. См. раздел Двусторонняя фильтрация с аппаратным обеспечением на основе Zynq (пакет поддержки панели инструментов Vision HDL для аппаратного обеспечения на основе Xilinx Zynq).
Здесь показана система ThreadFilterHExample.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');

Для достижения скромного гауссова размытия входного сигнала выберите относительно большое пространственное стандартное отклонение 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 необходимо выбрать тип данных с фиксированной точкой для коэффициентов фильтра. Тип коэффициента должен быть неподписанным. Для двусторонней фильтрации всегда предполагается, что диапазон ввода находится в интервале.
Поэтому a uint8 входные данные с диапазоном значений из
обрабатываются как.
Вычисленные значения коэффициентов меньше 1. Точные значения коэффициентов зависят от размера окрестности и стандартных отклонений. Большие окрестности расширяют гауссову функцию так, что каждое значение коэффициента меньше. Большее стандартное отклонение сглаживает гауссов для получения более однородных значений, в то время как меньшее стандартное отклонение дает максимальный отклик.
Если вы пытаетесь тип и коэффициенты квантуются так, что более половины ядра становится нулем для всех входных данных, Bilateral Filter блок выдает предупреждение. Если все коэффициенты равны нулю после квантования, блок выдает ошибку.
Модель преобразует входящее изображение RGB в интенсивность с помощью блока «Преобразователь цветового пространства». Затем изображение интенсивности оттенков серого посылается в блок двустороннего фильтра, который сконфигурирован для окрестности 9 на 9 и параметров, установленных ранее.
Двусторонний фильтр обеспечивает некоторое размытие по Гауссу, но будет сильно подчеркивать большие края на изображении, основываясь на размере окрестности 9 на 9.
open_system([modelname '/HDLAlgorithm'],'force');

Затем блок детектора кромки Собеля вычисляет величину градиента. Поскольку изображение было предварительно отфильтровано с использованием двустороннего фильтра с довольно большой окрестностью, меньшие, менее важные края в изображении не будут подчеркнуты во время обнаружения краев.
Пороговый параметр для блока Sobel Edge Detector может быть получен из постоянного значения маски блока или из порта. Блок в этой модели использует порт для динамического задания порогового значения. Это пороговое значение должно быть вычислено для конечной системы, но пока вы можете просто выбрать хорошее значение, наблюдая за результатами.
Чтобы наложить пороговые края на исходное изображение RGB, необходимо выровнять два потока. Задержка обработки двустороннего фильтра и граничного детектора означает, что пороговый граничный поток и входной поток пикселей RGB не выровнены во времени.
Блок выравнивания пиксельного потока снова объединяет их. Поток пикселей RGB соединен с верхним входным портом пикселей, а двоичный пороговый пиксель изображения соединен с опорным входным портом. Блок задерживает поток пикселей RGB, чтобы соответствовать пороговому потоку.
Необходимо задать для параметра number of lines значение, допускающее задержку как двустороннего фильтра, так и краевого детектора. Двусторонний фильтр 9 на 9 имеет задержку более 4 строк, в то время как краевой детектор имеет задержку более 1 строки. Для обеспечения безопасности установите Maximum number of lines до 10 на данный момент, чтобы вы могли попробовать различные размеры окрестностей позже. После завершения проектирования можно определить фактическое количество линий задержки, наблюдая за формами сигнала управления.
Квантование цвета уменьшает количество цветов в изображении, чтобы облегчить его обработку. Квантование цветов - это прежде всего проблема кластеризации, поскольку требуется найти один репрезентативный цвет для кластера цветов в исходном изображении.
Для этой задачи можно применить множество различных алгоритмов кластеризации, таких как k-means или медианный алгоритм вырезания. Другим распространенным подходом является использование octrees, которые рекурсивно делят цветовое пространство на 8 октантов. Как правило, задается максимальная глубина дерева, которое управляет рекурсивными поддеревьями, которые будут исключены и, следовательно, представлены одним узлом в вышеперечисленном поддереве.
Эти алгоритмы требуют, чтобы вы знали заранее все цвета в исходном изображении. В потоковом видео пикселей этап обнаружения цвета вносит нежелательную задержку кадра. Цветовое квантование также обычно лучше всего выполнять в воспринимаемом однородном цветовом пространстве, таком как L * a * b. При кластеризации цветов в пространстве RGB нет гарантии, что результат будет выглядеть репрезентативным для человека-зрителя.
Quantize подсистема в этой модели использует гораздо более простую форму квантования цвета, основанную на наиболее значимых 4 битах каждого 8-битового компонента цвета. RGB-тройки с 8-битными компонентами могут представлять до
цветов, но ни одно изображение не может использовать все эти цвета. Аналогично, при уменьшении числа битов на цвет до 4 изображение может содержать до
цветов. На практике 4-битное цветное изображение обычно содержит только несколько сотен уникальных цветов.
После сдвига каждого цветового компонента вправо на 4 бита модель сдвигает результат назад влево на 4 бита для поддержания 24-битного формата RGB, поддерживаемого средством просмотра видео. В системе ЛПВП следующие этапы обработки будут передавать только 4-битные цветные RGB-тройки.
open_system([modelname '/HDLAlgorithm/Quantize'],'force');

Блок переключения перекрывает края исходного изображения, выбирая либо поток RGB, либо параметр RGB. Переключатель переворачивается на основе обнаруженного краем двоичного изображения. Поскольку для карикатуры требуются сильные кромки, модель не использует альфа-смеситель.
Помимо пиксельных и управляющих сигналов в HDLAlgorithm подсистему поступают два параметра: порог градиента и тройка RGB линии для цвета наложения. FrameBoundary подсистема обеспечивает управление порогом и цветом линии во время выполнения. Однако, чтобы избежать выходного кадра с комбинацией цветов или порогов, подсистема регистрирует параметры только в начале каждого кадра.
open_system([modelname '/HDLAlgorithm/FrameBoundary'],'force');

После выполнения моделирования можно увидеть, что полученные в результате моделирования изображения показывают жирные линии вокруг обнаруженных элементов во входном видео.
Для проверки и генерации кода HDL, на который ссылается этот пример, необходимо иметь лицензию HDL Coder™.
Для создания кода HDL используется следующая команда.
makehdl('BilateralHDLExample/HDLAlgorithm')
Для создания тестового стенда используется следующая команда. Следует отметить, что создание тестового стенда занимает много времени из-за большого размера данных. Перед созданием испытательного стенда рекомендуется сократить время моделирования.
makehdltb('BilateralHDLExample/HDLAlgorithm')
Часть модели между блоками От кадра до пикселей и От пикселей до кадра может быть реализована на FPGA. HDLAlgorithm подсистема включает в себя все элементы двустороннего фильтра, обнаружения краев и наложения.
Двусторонний фильтр в этом примере настроен так, чтобы подчеркивать большие края при размывании меньших. Чтобы увидеть обнаружение кромок и наложение без двусторонней фильтрации, щелкните правой кнопкой мыши блок «Двусторонний фильтр» и выберите Comment Through. Затем повторно запустите моделирование. Обновленные результаты показывают, что обнаруживается много меньших кромок, и в целом кромки намного шумнее.
Эта модель имеет множество параметров, которыми можно управлять, таких как двусторонние стандартные отклонения фильтра, размер окрестности и пороговое значение. Размер окрестности определяет минимальную ширину подчеркнутых кромок. Меньшая окрестность приводит к выделению большего количества мелких кромок.
Можно также управлять внешним видом выходных данных, изменяя цвет наложения RGB и квантование цвета. Изменение порога обнаружения кромок управляет силой перекрываемых кромок.
Чтобы продолжить рисование изображения, попробуйте добавить несколько двусторонних фильтров. С помощью нужных параметров можно создать очень абстрактное изображение, которое подходит для различных алгоритмов сегментации изображения.
Эта модель создала изображение мультфильма, используя двустороннюю фильтрацию и генерацию градиента. Модель наложила линии мультфильма на версию исходного изображения RGB, которое было квантовано до уменьшенного числа цветов. Этот алгоритм подходит для реализации FPGA.
[1] Томази, К. и Р. Мандуджи. «Двусторонняя фильтрация для серых и цветных изображений». Шестая Международная конференция по компьютерному видению, 1998 год.