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

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

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

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

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

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

...
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)] = EnhancedEdgeDetectionHDLDesign(pixInVec(p,:),ctrlInVec(p));
     end
     frmOut = step(pix2frm,pixOutVec,ctrlOutVec);
     % Call the full-frame reference design
     [frmGray,frmDenoise,frmEdge,frmRef] = visionhdlenhancededge_reference(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
     EnhancedEdgeDetectionHDLViewer(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.

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

Функция, определяемая в EnhancedEdgeDetectionHDLDesign.m принимает пиксельный поток и структуру, состоящую из пяти управляющих сигналов, и возвращает измененный пиксельный поток и управляющую структуру. Для получения дополнительной информации о пиксельном протоколе потоковой передачи, используемом Системными объектами от 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™. Эти функции обрабатывают кадры полного образа. Такой исходный проект помогает проверить реализацию проекта пиксельного потока путем сравнения выходного изображения от исходного проекта полного кадра до вывода проекта пиксельного потока.

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

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

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

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

fprintf('Generating the MEX file, please wait ..\n');
codegen('EnhancedEdgeDetectionHDLTestBench');
fprintf('Executing the MEX file ..\n');
EnhancedEdgeDetectionHDLTestBench_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.

Обратитесь к (HDL Coder) для примера при создании и заполнении проектов HDL Coder MATLAB.

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

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