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

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

У вас должна быть лицензия MATLAB Coder, чтобы запустить этот пример.

Этот пример основывается на Передающем потоком пиксель Проекте в MATLAB (Vision HDL Toolbox) и Ускорение Передающего потоком пиксель Проекта Используя MATLAB Coder (Vision HDL Toolbox) примеры.

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

В 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, такую как tictoc, imnoise, и fprintf в этом примере используйте coder.extrinsic, чтобы объявить их, когда значение внешних параметров функционирует. Внешние функции исключены из генерации MEX. Симуляция выполняет их в регулярном интерпретированном режиме. Начиная с imnoise не включен в процесс генерации кода C, компилятор не может вывести тип данных и размер frmIn. Чтобы заполнить эту недостающую часть, мы добавляем оператор frmIn = нули (actLine, actPixPerLine, 3, 'uint8') перед внешним циклом for.

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

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

codegen('EnhancedEdgeDetectionHDLTestBench');
EnhancedEdgeDetectionHDLTestBench_mex;
frame 1: reference and design output differ in more than 20 pixels.

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

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

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

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

coder -hdlcoder -new EnhancedEdgeDetectionProject

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

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

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

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