В этом примере показано, как генерировать потоки пикселей многоуровневой пирамиды изображения из входного потока. Эта модель выводит множество потоков пикселей путем понижающей дискретизации исходного изображения как в горизонтальном, так и в вертикальном направлениях с использованием гауссовой фильтрации. Этот тип фильтра позволяет избежать наложения артефактов. В реализации используется архитектура, подходящая для FPGA.
Пирамида изображения используется во многих приложениях обработки изображения, таких как сжатие изображения, обнаружение и распознавание объектов, с использованием методов, таких как сверточная нейронная сеть (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');

Каждый уровень пирамиды содержит блок линейного буфера и фильтр понижающей дискретизации.
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 сигнал достоверности шины изменяется на высокий, а затем на низкий каждый другой пиксель. После второй понижающей выборки она чередуется с шаблоном из одного действительного пикселя, за которым следуют три недопустимых пикселя. В некоторых приложениях может потребоваться собрать все допустимые пикселы в непрерывный период времени. Блок Pixel Stream FIFO, используемый между каскадами понижающей дискретизации, создает непрерывные действительные пиксели для каждой строки.
Каждая подсистема ResamplingPyramidFilter принимает параметры для размера выходного кадра. Эти числа должны быть целыми числами и в два раза меньше входного изображения. Если входное число пикселей на строку нечетное, а не четное, округляйте до следующего целого числа. Например, если размер входного сигнала составляет 25 пикселей на строку, требуемый размер выходного сигнала должен быть 12 пикселей на строку.
Гауссово ядро фильтра, используемое в традиционной пирамиде изображения, не является единственным фильтром нижних частот, который может быть использован. Использование сохраняющего края фильтра нижних частот, такого как двусторонний фильтр с различными размерами ядра, сохранит большую детализацию в пирамиде.
Иногда полезно вычислить разницу между двумя уровнями пирамиды изображения. Этот алгоритм называется лапласианской пирамидой. Меньший уровень увеличивается до того же размера, что и больший уровень, и фильтруется. Фильтр обычно является масштабированной версией того же аппроксимированного гауссова фильтра, который используется в этой модели. Разница между уровнями представляет информацию, потерянную в процессе понижающей дискретизации. Пирамида Лапласа может быть использована для применения, в том числе для снятия шума, для создания изображений, сделанных в разное время или с различным фокусным расстоянием, и многих других.
Потенциальным ограничением этой модели является то, что существует достаточно высокая задержка между выходными потоками. Эта задержка возникает, поскольку второй и третий уровни зависят от выходных данных предыдущего уровня. Этого можно избежать, создав параллельные фильтры, работающие на большем количестве линий. В этом примере реализован фильтр 5 на 5, который хранит 5 строк на каждом уровне. Параллельная реализация с более низкой задержкой требует 13 строк памяти для двухуровневого фильтра или 103 строки для трехуровневого фильтра. Это, как правило, не является экономически эффективным компромиссом.
В FPGA память линейных буферов обычно реализуется с использованием блочных RAM. Меньшие объемы памяти могут быть реализованы в фабрике FPGA и известны как распределенные RAM. Инструмент синтеза выбирает блочную или распределенную оперативную память в зависимости от ресурсов устройства. Поскольку размер линии становится меньше из-за понижающей дискретизации, распределенные RAM могут быть более эффективными. В этом примере Буфер строк (Line Buffer) блокирует в резервном пространстве каждого уровня до 2k пикселей на строку. Этот размер является размером по умолчанию для линейного буфера и вмещает видео формата до 1080p. Для назначения распределенных RAM задайте для параметра Line buffer size малую степень, равную двум. В этом примере можно задать размеры буфера строк трех уровней 256, 128 и 64.
[1] Берт, П. и Э. Адельсон. «Лапласианская пирамида как компактный код изображения» IEEE Transactions on Communications 31, No. 4 (апрель 1983): 532-40.