exponenta event banner

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

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

Предварительные условия для сторонних производителей

Необходимый

В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.

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

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

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

Проверка среды графического процессора

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

Создание CUDA MEX для функции

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

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;

См. также

Функции

Объекты

Связанные темы