Обнаружение ребра на графическом процессоре с помощью фильтров статистической величины Порядка

Этот пример показывает, как сгенерировать CUDA® MEX для функции MATLAB®, которая обнаруживает ребра в изображениях при помощи фильтров статистической величины порядка. Прикажите, чтобы статистические фильтры были нелинейными пространственными фильтрами, ответ которых основан на упорядоченном расположении (рейтинг) пикселей, содержавшихся в области изображения, охваченной фильтром, и затем заменяющий значение в центральном пикселе со значением, определенным занимающим место результатом. Различные типы фильтров статистики порядка включают медиану, максимум и минимальные фильтры. Пример берет интенсивность или двухуровневое изображение, как введено и использует функцию ordfilt2, которая является частью Image Processing Toolbox™, чтобы произвести обнаруженное изображение ребра.

Предпосылки

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

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

  • Image Processing Toolbox

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

Создайте папку и скопируйте соответствующие файлы

Следующая строка кода создает папку в вашей текущей рабочей папке (pwd) и копирует все соответствующие файлы в эту папку. Если вы не хотите выполнять эту операцию или если вы не можете сгенерировать файлы в этой папке, изменить вашу текущую рабочую папку.

gpucoderdemo_setup('gpucoderdemo_edge_detection');

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

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

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

О функции 'edge_detection'

Функция edge_detection.m берет интенсивность или двухуровневое изображение, как введено и возвращается, ребро обнаружило двухуровневое изображение.

type edge_detection
function outImage = edge_detection(input)%#codegen
%  Copyright 2019 The MathWorks, Inc.
coder.gpu.kernelfun();

% In this edge detection algorithm we used the "Max - Min" filter. 
% The "Max - Min" filter blurs the image by replacing each pixel with the 
% difference of the highest pixel and the lowest pixel (with respect to intensity) 
% within the specified windowsize.

% Convert RGB image to gray scale image.
if size(input,3)==3
    inputImage = rgb2gray(input);
else
    inputImage = input;
end


% Parameters to ordfilt2 for finding Maximum & Minimum filters. 
dom = ones(2);
minOrder = 1;
maxOrder = 4;
padopt = 'zeros';

% Used ordfilt2 here
MinImg = ordfilt2(inputImage,minOrder,dom,padopt);
MaxImg = ordfilt2(inputImage,maxOrder,dom,padopt);

% edge detected output
outImage = MaxImg - MinImg;
outImage = imbinarize(outImage);
end

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

Чтобы сгенерировать MEX CUDA для функции edge_detection, создайте код, настройка графического процессора кода возражает и использует функцию codegen.

inputImage = imread('highway.png');
cfg = coder.gpuConfig('mex');
codegen -args {inputImage} -config cfg edge_detection -o edge_detection_gpu_mex

Запустите сгенерированный MEX CUDA

Запустите сгенерированный edge_detection_gpu_mex с входным изображением и постройте вход, и ребро обнаружило изображения.

[outputImage] = edge_detection_gpu_mex(inputImage);

% plot images
p1  = subplot(1, 2, 1);
p2 = subplot(1, 2, 2);
imshow(inputImage, 'Parent', p1);
imshow(outputImage, 'Parent', p2);
title(p1, 'Input Image');
title(p2, 'Edge Detected Image');

Команда выполнения: Очистка

Удалите временные файлы и возвратитесь к исходной папке

cleanup