Этот пример демонстрирует обнаружение ребра в изображении с функцией CUDA ® MEX, сгенерированной функцией MATLAB ®. Алгоритм обнаружения ребер реализован с типом данных половинной точности.
Необходимый
Этот пример генерирует CUDA MEX и имеет следующие требования к третьим лицам.
CUDA включил графический процессор NVIDIA ® с минимальной вычислительной способностью 6,0 и совместимым драйвером.
Дополнительный
Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Набор инструментальных средств NVIDIA.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации см. раздел «Оборудование сторонних производителей» и «Настройка продуктов для подготовки».
Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте coder.checkGpuInstall
функция.
envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);
В алгоритме обнаружения ребер Собеля sobelEdgeDetectionAlg.m
операцию 2-D пространственного градиента выполняют на сером масштабном изображении. Эта операция подчеркивает области высокой пространственной частоты, которые соответствуют ребрам на изображении.
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
Алгоритм ребра Собеля вычисляет горизонтальный градиент resX
и вертикальный градиент resY
Вход изображения при помощи двух ортогональных ядер фильтра maskX
и maskY
. После операции фильтрации алгоритм вычисляет величину градиента и применяет порог для поиска областей изображений, которые считаются ребрами.
Используйте стандартную imread
команда для чтения изображений. imread
представляет каналы RGB изображений с целыми числами, по одному для каждого пикселя. Целые числа варьируются от 0 до 255. Простое приведение входов к половинному типу может привести к переполнению во время сверток. В этом случае мы можем масштабировать изображения до значений от 0 до 1.
im = imread('peppers.png');
figure();
image(im);
imPacked = half(im)/255;
thresh = half(100)/255;
Чтобы сгенерировать CUDA MEX для sobelEdgeDetectionAlg
function, создайте объект строения кода GPU и запустите codegen
команда. Чтобы сгенерировать и выполнить код с типами данных половинной точности, требуется вычислительная способность CUDA 6.0 или выше. Установите ComputeCapability
свойство объекта строения кода, чтобы '6.0'
. Для половинной точности режим выделения памяти (malloc) для генерации кода CUDA должен быть установлен на 'Discrete'.
cfg = coder.gpuConfig('mex'); cfg.GpuConfig.ComputeCapability = '6.0'; cfg.GpuConfig.MallocMode = 'Discrete'; codegen -config cfg -args {imPacked,thresh} sobelEdgeDetectionAlg;
Code generation successful.
После того, как вы сгенерируете MEX-функцию, можно проверить, что она имеет те же функциональные возможности, что и исходная функция точки входа MATLAB. Запуск сгенерированного sobelEdgeDetectionAlg_mex
и постройте график результатов.
out_disp = sobelEdgeDetectionAlg_mex(imPacked,thresh); imagesc(out_disp);
Очистить загруженный в память статический сетевой объект.
clear mex;
codegen
| coder.checkGpuInstall
| coder.gpu.constantMemory
| coder.gpu.kernel
| coder.gpu.kernelfun
| gpucoder.matrixMatrixKernel
| gpucoder.stencilKernel