Создайте аппаратный фильтр изображений в MATLAB

В этом примере показано, как спроектировать аппаратный фильтр изображений с использованием объектов Vision HDL Toolbox™.

Ключевыми возможностями модели для аппаратно-целевой обработки видео в MATLAB ® являются:

  • Интерфейс потокового пикселя: Системные объекты в Vision HDL Toolbox используют интерфейс потокового пикселя. Последовательная обработка эффективна для аппаратных проектов, потому что для хранения пиксельных данных требуется меньше памяти. Последовательный интерфейс позволяет объекту работать независимо от размера и формата изображения и делает проект более устойчивым к ошибкам синхронизации видео. Для получения дополнительной информации смотрите Интерфейс потокового пикселя.

  • Функция, предназначенная для генерации HDL-кода: После преобразования данных в поток пикселей, можно спроектировать модель оборудования, выбрав Системные объекты из библиотек Vision HDL Toolbox. Часть проекта, предназначенная для генерации HDL-кода, должна быть в отдельной функции.

  • Преобразование в видео на основе фрейма: Для верификации можно отобразить видео на основе фрейма или сравнить результат вашего аппаратно-совместимого проекта с выходом поведенческой модели на основе фрейма MATLAB. Vision HDL Toolbox предоставляет системную object™, которая позволяет десериализовать выход вашего проекта.

Импорт данных

Считайте файл изображения в рабочую область. Этот пример изображения содержит 256 × 256 пикселей. Каждый пиксель является единичным uint8 значение, представляющее интенсивность. Чтобы уменьшить скорость симуляции во время тестирования, выберите миниатюрный фрагмент изображения.

Симуляция последовательного видео на интерпретируемом языке MATLAB может занять много времени. После отладки проекта с небольшим размером изображения используйте генерацию кода MEX, чтобы ускорить проверку с большими изображениями. Смотрите Ускорение потокового проекта пикселей с помощью MATLAB Coder.

origIm = imread('rice.png');
origImSize = size(origIm)
imActivePixels = 64;
imActiveLines = 48;
inputIm = origIm(1:imActiveLines,1:imActivePixels);
figure
imshow(inputIm,'InitialMagnification',300)
title 'Input Image'
origImSize =

   256   256

Сериализация данных

The visionhdl.FrameToPixels Системный объект преобразует кадрированное видео в пиксельный поток и структуру управления. Этот объект предоставляет входы для функции, предназначенной для генерации HDL-кода, но сам не поддерживает генерацию HDL-кода.

Чтобы симулировать со стандартным форматом видео, выберите предопределенный формат заполнения видео, чтобы соответствовать вашему источнику входа. Чтобы моделировать с помощью пользовательского изображения, выберите размерности неактивных областей, чтобы окружить изображение. В этом руководстве используется пользовательское изображение. Свойства visionhdl.FrameToPixels объект соответствует размерностям в схеме.

Создайте visionhdl.FrameToPixels Объекту и установите свойства изображения. Изображение является изображением интенсивности с скалярным значением, представляющим каждый пиксель, поэтому заданным NumComponents свойство для 1. Это руководство заполняет миниатюрное изображение 5 неактивными линиями выше и ниже и 10 неактивными пикселями на передней и задней частях каждой строки.

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

Примечание.Этот синтаксис выполняется только в R2016b или более поздней версии. Если вы используете более ранний релиз, замените каждый вызов объекта на эквивалентный step синтаксис. Для примера замените myObject(x) с step(myObject,x).

frm2pix = visionhdl.FrameToPixels(...
         'NumComponents',1,...
         'VideoFormat','custom',...
         'ActivePixelsPerLine',imActivePixels,...
         'ActiveVideoLines',imActiveLines,...
         'TotalPixelsPerLine',imActivePixels+20,...
         'TotalVideoLines',imActiveLines+10,...
         'StartingActiveLine',6,...
         'FrontPorch',10);

[~,~,numPixelsPerFrame] = getparamfromfrm2pix(frm2pix);
[pixel,ctrl] = frm2pix(inputIm);

Проектирование HDL-совместимой модели

Выберите объект обработки изображений из visionhdl библиотека. В этом руководстве используются visionhdl.ImageFilter.

Создайте функцию, содержащую постоянный образец этого объекта. Функция обрабатывает один пиксель, выполняя один вызов объекта.

The ctrlIn и ctrlOut аргументы объекта являются структурами, которые содержат пять управляющих сигналов. Сигналы указывают валидность каждого пикселя и местоположение каждого пикселя в системе координат.

Установите коэффициенты фильтра visionhdl.ImageFilter для выполнения операции 2 × 2 размытия.

Для этого руководства вам не нужно менять LineBufferSize свойство объекта фильтра. Этот параметр не влияет на скорость симуляции, поэтому его не нужно изменять при симуляции с небольшим тестовым изображением. При выборе LineBufferSizeвыберите степень двойки, которая соответствует размеру активной линии самого большого необходимого формата системы координат. Значение по умолчанию 2048 принимает формат видео 1080p.

function [pixOut,ctrlOut] = HDLTargetedDesign(pixIn,ctrlIn)

  persistent filt2d
  if isempty(filt2d) 
      filt2d = visionhdl.ImageFilter(...
          'Coefficients',ones(2,2)/4,...
          'CoefficientsDataType','Custom',...
          'CustomCoefficientsDataType',numerictype(0,1,2),...
          'PaddingMethod','Symmetric');
  end
    
  [pixOut,ctrlOut] = filt2d(pixIn,ctrlIn);
end

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

pixelOut = zeros(numPixelsPerFrame,1,'uint8');
ctrlOut  = repmat(pixelcontrolstruct,numPixelsPerFrame,1);
 for p = 1:numPixelsPerFrame
    [pixelOut(p),ctrlOut(p)] = HDLTargetedDesign(pixel(p),ctrl(p));
 end

Десериализируйте фильтрованный поток пикселей

The visionhdl.PixelsToFrame Системный объект преобразует поток пикселей в видео на основе кадров. Используйте этот объект для десериализации отфильтрованных данных из visionhdl.ImageFilter. Установите свойства размерности изображения, так чтобы они совпадали с тестовым изображением. Вызовите объект, чтобы преобразовать выход HDL-целевой функции в матрицу.

pix2frm = visionhdl.PixelsToFrame(...
         'NumComponents',1,...
         'VideoFormat','custom',...
         'ActivePixelsPerLine',imActivePixels,...
         'ActiveVideoLines',imActiveLines);

[outputIm,validIm] = pix2frm(pixelOut,ctrlOut);

Отображение результатов

Используйте imshow функция для отображения результатов операции.

if validIm
    figure
    imshow(outputIm,'InitialMagnification',300)
    title 'Output Image'
end

Сравнение с поведенческой моделью

Если у вас есть поведенческая модель проекта, можно сравнить выходные системы координат визуально или математически. Для фильтрации можно сравнить visionhdl.ImageFilter с imfilter (Image Processing Toolbox) функция в Image Processing Toolbox™. The imfilter функция действует на системе координат как матрица и возвращает изменённую систему координат как матрицу. Можно сравнить эту матрицу с матричным выходом pix2frm объект.

Чтобы избежать зависимости от лицензии Image Processing Toolbox, это руководство не выполняет сравнение.

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

Когда ваш проект работает в симуляции, используйте HDL- Coder™, чтобы сгенерировать HDL-код для HDLTargetedDesign функция. См. «Генерация HDL-кода из MATLAB».

Похожие темы