Обнаружение ребра с методом Sobel в полуточности

Этот пример демонстрирует обнаружение ребра в изображении с MEX-функцией, сгенерированной от функции MATLAB®. Алгоритм обнаружения ребра реализован с типом данных полуточности.

Предпосылки

  • CUDA включил NVIDIA, графический процессор с вычисляет возможность 3.2 или выше.

  • NVIDIA инструментарий CUDA и драйвер.

  • Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов.

  • Интерфейс GPU Coder™ для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте Add-On Explorer.

Проверьте среду графического процессора

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

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

Алгоритм обнаружения ребра Sobel

В алгоритме обнаружения ребра Sobel (sobelEdgeDetectionAlg.m), 2D пространственная операция градиента выполняется на полутоновом изображении. Эта операция подчеркивает высокие пространственные области частоты, которые соответствуют ребрам в изображении.

type sobelEdgeDetectionAlg
function edgeImg = sobelEdgeDetectionAlg(img,thresh)  %#codegen
%sobelEdgeDetection Example MATLAB function for edge detection.
% Copyright 2018 The MathWorks, Inc.

kern = half([1 2 1; 0 0 0; -1 -2 -1]);

% Finding horizontal and vertical gradients.
h = conv2(img(:,:,2),kern,'same');
v = conv2(img(:,:,2),kern','same');

% Finding magnitude of the gradients.
e = sqrt(h.*h + v.*v);

% Threshold the edges
edgeImg = uint8((e > thresh) * 240);

end

Алгоритм ребра Sobel вычисляет горизонтальный градиент resX и вертикальный градиент resY из входа отображают при помощи двух ортогональных ядер фильтра maskX и maskY. После операции фильтрации алгоритм вычисляет величину градиента и применяет threhold, чтобы найти области изображений, которые считаются ребрами.

Считайте изображения и упакуйте данные в RGBA упакованный упорядоченный по столбцам порядок

Используйте стандартный imread команда, чтобы считать изображения. imread представляет каналы RGB изображения с целыми числами, один для каждого пикселя. Целые числа лежат в диапазоне от 0 до 255. Просто кастинг входных параметров к половине типа может привести к переполнению во время сверток. В этом случае мы можем масштабировать изображения к значениям между 0 и 1.

im = imread('peppers.png');
figure();
image(im);
imPacked = half(im)/255;
thresh = half(100)/255;

Сгенерируйте MEX CUDA для функции

Сгенерировать MEX CUDA для sobelEdgeDetectionAlg функционируйте, создайте объект настройки графического процессора кода и запустите codegen команда. Чтобы сгенерировать и выполнить код с типами данных полуточности, CUDA вычисляют возможность 5,3, или выше требуется. Установите ComputeCapability свойство настройки кода возражает против '5.3'. Для полуточности выделение памяти (malloc) режим для генерации кода CUDA должно быть установлено в 'Дискретный'.

cfg = coder.gpuConfig('mex');
cfg.GpuConfig.ComputeCapability = '5.3';
cfg.GpuConfig.MallocMode = 'Discrete';

codegen -config cfg -args {imPacked,thresh} sobelEdgeDetectionAlg;

Запустите MEX-функцию

После того, как вы генерируете MEX-функцию, можно проверить, что она имеет ту же функциональность как исходная функция точки входа MATLAB. Запустите сгенерированный sobelEdgeDetectionAlg_mex и постройте результаты.

out_disp = sobelEdgeDetectionAlg_mex(imPacked,thresh);
imagesc(out_disp);

Очистите память MEX.

Очистите статический сетевой объект, который загрузился в памяти.

clear mex;