Пирамида изображений для FPGA

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

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

Модель в качестве примера берет ввод видео на 240 пунктов и производит три потока вывода: 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). Каждый вектор в отделимом представлении также симметричен, таким образом, реализация фильтра использует предварительный сумматор симметрии, чтобы далее сократить количество операций.

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

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

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

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

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

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

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

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

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

На FPGAs буферная память линии обычно реализуется с помощью блока RAM. Меньшая память может быть реализована в матрице FPGA и известна как распределенные RAM. Ваш инструмент синтеза выбирает блок или распределил RAM в зависимости от ресурсов вашего устройства. Когда размер линии становится меньшим из-за субдискретизации, распределенные RAM могут быть более эффективными. В этом примере Буфер Линии блокируется на каждом резервном пробеле уровня для до 2k пикселей на строку. Этот размер является размером по умолчанию для Буфера Линии и размещает видео формата на 1 080 пунктов. Чтобы предназначаться для распределенных RAM, задайте маленькую степень двойки для параметра buffer size Линии. В этом примере вы могли установить буферные размеры линии этих трех уровней к 256, 128, и 64.

Ссылки

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