Расширенное обнаружение ребра от шумного цветного видео

Этот пример демонстрирует, как разработать комплексный алгоритм обработки видеоданных пиксельного потока, ускорить его симуляцию с помощью MATLAB Coder™ и сгенерировать HDL-код из проекта. Алгоритм улучшает обнаружение ребра от шумного цветного видео. У вас должна быть лицензия MATLAB Coder, чтобы запустить этот пример.

Испытательный стенд

В mlhdlc_vht_enhancededge_tb файле объект videoIn читает каждый кадр из цветного источника видеосигнала, и функция imnoise добавляет перечный шум и соль. Это шумное цветное изображение передается объекту frm2pix, который преобразовывает кадр полного образа в поток пикселей и управляющих структур. Функция mlhdlc_vht_enhancededge затем вызвана, чтобы обработать один пиксель (и его связанная управляющая структура) за один раз. После того, как мы обработаем целый пиксельный поток и соберем поток вывода, pix2frm объект преобразовывает поток вывода в видео полного кадра. Исходный проект полного кадра mlhdlc_vht_enhancededge_ref также называется, чтобы обработать шумное цветное изображение. Его вывод по сравнению с тем из проекта пиксельного потока. Функция mlhdlc_vht_enhancededge_viewer вызвана, чтобы отобразить видеовыходы.

Рабочий процесс выше реализован в следующих строках mlhdlc_vht_enhancededge_tb.

      ...
      frmIn = zeros(actLine,actPixPerLine,3,'uint8');
      for f = 1:numFrm
          frmFull = step(videoIn);                  % Get a new frame
          frmIn = imnoise(frmFull,'salt & pepper'); % Add noise
          % Call the pixel-stream design
          [pixInVec,ctrlInVec] = step(frm2pix,frmIn);
          for p = 1:numPixPerFrm
              [pixOutVec(p),ctrlOutVec(p)] = mlhdlc_vht_enhancededge(pixInVec(p,:),ctrlInVec(p));
          end
          frmOut = step(pix2frm,pixOutVec,ctrlOutVec);
          % Call the full-frame reference design
          [frmGray,frmDenoise,frmEdge,frmRef] = mlhdlc_vht_enhancededge_ref(frmIn);
          % Compare the results
          if nnz(imabsdiff(frmRef,frmOut))>20
              fprintf('frame %d: reference and design output differ in more than 20 pixels.\n',f);
              return;
          end
          % Display the results
          mlhdlc_vht_enhancededge_viewer(actPixPerLine,actLine,[frmGray frmDenoise uint8(255*[frmEdge frmOut])],[frmFull frmIn]);
      end
      ...

Поскольку frmGray и frmDenoise являются uint8 типом данных, в то время как frmEdge и frmOut являются логическими, uint8 (255x [frmEdge frmOut]) сопоставляет логический ложный и верный для uint8 (0) и uint8 (255), соответственно, так, чтобы матрицы могли быть конкатенированы.

И frm2pix и pix2frm используются, чтобы преобразовать между областями пиксельного потока и полным кадром. Внутренний цикл for выполняет обработку пиксельного потока. Остальная часть испытательного стенда выполняет обработку полного кадра.

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

Для функций, которые не поддерживают генерацию кода C, такую как tic, toc, imnoise и fprintf в этом примере, используют coder.extrinsic, чтобы объявить их как внешние функции. Внешние функции исключены из генерации MEX. Симуляция выполняет их в регулярном интерпретированном режиме. Поскольку imnoise не включен в процесс генерации кода C, компилятор не может вывести тип данных и размер frmIn. Чтобы заполнить эту недостающую часть, мы добавляем оператор frmIn = нули (actLine, actPixPerLine, 3, 'uint8') перед внешним циклом for.

Проект пиксельного потока

Функция mlhdlc_vht_enhancededge принимает пиксельный поток и структуру, состоящую из пяти управляющих сигналов, и возвращает измененный пиксельный поток и управляющую структуру. Для получения дополнительной информации о пиксельном протоколе потоковой передачи, используемом Системными объектами от Vision HDL Toolbox, см. документацию.

В этом примере rgb2gray объект преобразовывает цветное изображение в шкалу полутонов, medfil удаляет перечный шум и соль. sobel подсвечивает ребро. Наконец, объект mclose выполняет морфологическое закрытие, чтобы улучшить ребро вывод. Код показывают ниже.

      [pixGray,ctrlGray] = step(rgb2gray,pixIn,ctrlIn);         % Convert RGB to grayscale
      [pixDenoise,ctrlDenoise] = step(medfil,pixGray,ctrlGray); % Remove noise
      [pixEdge,ctrlEdge] = step(sobel,pixDenoise,ctrlDenoise);  % Detect edges
      [pixClose,ctrlClose] = step(mclose,pixEdge,ctrlEdge);     % Apply closing

Исходный проект полного кадра

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

Функция mlhdlc_vht_enhancededge_ref содержит подобный набор четырех функций как в mlhdlc_vht_enhancededge. Основное отличие - то, что функции из Image Processing Toolbox обрабатывают данные полного кадра.

Из-за различия в реализации между функцией edge и visionhdl. Системный объект EdgeDetector, ссылка и проектная мощность рассматриваются, соответствуя, если frmOut и frmRef отличаются по не больше, чем 20 пикселей.

Создайте файл MEX и моделируйте проект

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

currDir = pwd;
tempDir = tempname;

% Create a temporary folder and copy the MATLAB files.
mkdir(tempDir);
demoDir = fullfile(matlabroot,'toolbox','hdlcoder','hdlcoderdemos','matlabhdlcoderdemos');
copyfile(fullfile(demoDir,'mlhdlc_vht_enhancededge_tb.m'),tempDir);
copyfile(fullfile(demoDir,'mlhdlc_vht_enhancededge.m'),tempDir);
copyfile(fullfile(demoDir,'mlhdlc_vht_enhancededge_ref.m'),tempDir);
copyfile(fullfile(demoDir,'mlhdlc_vht_enhancededge_viewer.m'),tempDir);
cd(tempDir);

Сгенерируйте и выполните файл MEX.

fprintf('Generating the MEX file, please wait ..\n');
codegen('mlhdlc_vht_enhancededge_tb');
fprintf('Executing the MEX file ..\n');
mlhdlc_vht_enhancededge_tb_mex;
Generating the MEX file, please wait ..
Executing the MEX file ..
frame 1: reference and design output differ in more than 20 pixels.

Верхний видеоплеер отображает видео исходного цвета слева и его шумную версию после добавляющей соли и перечного шума справа. Более низкий видеоплеер, слева направо, представляет: полутоновое изображение после преобразования цветового пространства, de-noised версия после среднего фильтра, ребро вывод после обнаружения ребра и расширенного ребра вывод после морфологической заключительной операции.

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

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

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

coder -hdlcoder -new EnhancedEdgeDetectionProject

Затем добавьте файл 'EnhancedEdgeDetectionHDLDesign.m' в проект как функция MATLAB и 'EnhancedEdgeDetectionHDLTestBench.m' как Испытательный стенд MATLAB.

Обратитесь к Началу работы с MATLAB к Рабочему процессу HDL для примера при создании и заполнении проектов HDL Coder MATLAB.

Запустите Советника по вопросам Рабочего процесса. В Советнике по вопросам Рабочего процесса щелкните правой кнопкой по шагу 'Code Generation'. Выберите опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию HDL-кода.

Исследуйте сгенерированный HDL-код путем щелчка по ссылкам в логарифмическом окне.

Запустите следующие команды, чтобы очистить временную папку проекта.

clear mlhdlc_vht_enhancededge_tb_mex;
cd(currDir);
rmdir(tempDir,'s');
clear currDir tempDir demoDir;