Изображение Пирамиды

Этот пример показов, как сгенерировать многоуровневые потоки пикселей пирамиды изображения из потока входа. Эта модель выводит несколько пиксельных потоков путем понижающей дискретизации оригинального изображения как в горизонтальном, так и в вертикальном направлениях с помощью фильтрации Гауссова. Этот тип фильтра избегает сглаживания программных продуктов. Реализация использует архитектуру, подходящую для ПЛИС.

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

Пример модели принимает видео входа 240p и выдает три потока выхода: 160x120, 80x60 и 40x30.

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

Каждый уровень пирамиды содержит блок Line Buffer и фильтр понижающей дискретизации.

open_system([modelname '/ImagePyramidTop/ResamplingPyramidFilter'],'force');

Коэффициенты Фильтра

Приблизительные коэффициенты Гауссова фильтра в [1] использовались в ряде реализаций пирамиды изображений. Эти коэффициенты заданы:

format long
Hh = [1 4 6 4 1]./16;
Hv = Hh';
Hg = Hv*Hh
Hg =

  Columns 1 through 3

   0.003906250000000   0.015625000000000   0.023437500000000
   0.015625000000000   0.062500000000000   0.093750000000000
   0.023437500000000   0.093750000000000   0.140625000000000
   0.015625000000000   0.062500000000000   0.093750000000000
   0.003906250000000   0.015625000000000   0.023437500000000

  Columns 4 through 5

   0.015625000000000   0.003906250000000
   0.062500000000000   0.015625000000000
   0.093750000000000   0.023437500000000
   0.062500000000000   0.015625000000000
   0.015625000000000   0.003906250000000

Результаты аналогичны, но не совсем аналогичны Гауссову ядру с стандартным отклонением 1.0817797. Итак, Hg является приблизительным Гауссовым ядром.

Hf = fspecial('gaussian',5,1.0817797)
Hf =

  Columns 1 through 3

   0.004609023214619   0.016606534868404   0.025458671096979
   0.016606534868404   0.059834153028525   0.091728830511040
   0.025458671096979   0.091728830511040   0.140625009648116
   0.016606534868404   0.059834153028525   0.091728830511040
   0.004609023214619   0.016606534868404   0.025458671096979

  Columns 4 through 5

   0.016606534868404   0.004609023214619
   0.059834153028525   0.016606534868404
   0.091728830511040   0.025458671096979
   0.059834153028525   0.016606534868404
   0.016606534868404   0.004609023214619

Фильтр, Hg, очевидно отделяемый, поскольку он был построен из горизонтальных и вертикальных векторов. Поэтому реализация разделяемого фильтра является хорошим выбором. Многие значения коэффициентов являются степенями двойки или комбинацией только двух степеней двойки. Эти значения означают, что реализация фильтра может заменить умножение на сдвиг и добавить методы, такие как каноническая цифра со знаком (CSD). Каждый вектор в разделяемом представлении также симметричен, поэтому реализация фильтра использует предварительный сумматор симметрии, чтобы дополнительно уменьшить количество операций.

Субдискретизация

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

Модель включает горизонтальный и вертикальный счетчики, которые сравнивают количество выхода пикселей и линий с параметрами маски для активных пикселей и линий. Модель использует эти счетчики, чтобы воссоздать сигналы конца линии (hEnd) и конца системы координат (vEnd).

После понижающей дискретизации один раз, pixelcontrol допустимый сигнал шины чередует высокий и затем низкий каждый другой пиксель. После второго downsample он чередуется с шаблоном из одного допустимого пикселя, за которым следуют три недопустимых пикселя. В некоторых приложениях можно хотеть собрать все допустимые пиксели в постоянно действительный период времени. Блок Pixel Stream FIFO, используемый между этапами downsample, производит непрерывные допустимые пиксели для каждой линии.

Каждая подсистема ResamplingPyramidFilter принимает параметры для выхода формата кадра. Эти числа должны быть целыми числами и коэффициентом на два меньше, чем входом изображение. Если входное количество пикселей на линию нечетное, а не четное, то округлить до следующего целого числа. Для примера, если размер входа составляет 25 пикселей на строку, требуемый размер выхода должен быть 12 пикселей на строку.

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

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

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

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

В FPGA памяти буфера линии обычно реализуются с использованием ОЗУ блоков. Меньшие памяти могут быть реализованы в ткани FPGA и известны как распределенные ОЗУ. Ваш инструмент синтеза выбирает блок или распределенную ОЗУ в зависимости от ресурсов вашего устройства. Поскольку размер линии становится меньше из-за понижающей дискретизации, распределенные ОЗУ могут быть более эффективными. В этом примере Line Buffer блокирует в каждом резервном пространстве уровня до 2k пикселей на линию. Этот размер является размером по умолчанию для Line Buffer и включает видео в формате до 1080p. Чтобы нацелить распределенные ОЗУ, задайте небольшую степень двойки для параметра Line buffer size. В этом примере можно задать размеры буфера линии трех уровней 256, 128 и 64.

Ссылки

[1] Берт, П. и Э. Адельсон. «Лаплакская пирамида как компактное изображение». Транзакции IEEE по коммуникациям 31, № 4 (апрель 1983): 532-40.