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

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

Сторонние необходимые условия

Необходимый

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

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

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

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

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

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

Считайте изображения и упакуйте данные в 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;