Обнаружение ребра методом Собеля с половинной точностью

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

Необходимые условия для третьих лиц

Необходимый

Этот пример генерирует CUDA MEX и имеет следующие требования к третьим лицам.

  • CUDA включил графический процессор NVIDIA ® с минимальной вычислительной способностью 6,0 и совместимым драйвером.

Дополнительный

Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверьте окружение GPU

Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте 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. После операции фильтрации алгоритм вычисляет величину градиента и применяет порог для поиска областей изображений, которые считаются ребрами.

Чтение изображений и упаковка данных в основной порядок упакованных столбцов 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 для функции

Чтобы сгенерировать 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-функции

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

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

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

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

clear mex;

См. также

Функции

Объекты

Похожие темы