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

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

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

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

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

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

Введение

Систему BilateralFilterHDLExample.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]$. Поэтому uint8 введите с областью значений значений от$[0,255]$, обработаны как$$\frac{[0,255]}{255} $$. Расчетные содействующие значения меньше 1. Точные значения коэффициентов зависят от размера окружения и стандартных отклонений. Большие окружения распространяют Гауссову функцию, таким образом, что каждое содействующее значение меньше. Большее стандартное отклонение сглаживает Гауссово, чтобы произвести более универсальные значения, в то время как меньшее стандартное отклонение производит остроконечный ответ.

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

Шаг 2: отфильтруйте изображение интенсивности

Модель преобразует входящее изображение RGB в интенсивность с помощью блока Color Space Converter. Затем полутоновое изображение интенсивности отправляется в блок Bilateral 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, нет никакой гарантии, что результат будет выглядеть представительным к человеческому средству просмотра.

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. Переключатель инвертируется на основе обнаруженного ребром бинарного изображения. Поскольку cartooning требует сильных ребер, модель не использует альфа-микшер.

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

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

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

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

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

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

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

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

makehdl('BilateralHDLExample/HDLAlgorithm')

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

makehdltb('BilateralHDLExample/HDLAlgorithm')

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

Движение далее

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

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

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

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

Заключение

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

Ссылки

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