Этот пример показывает использование функций обработки изображений для генерации кода GPU. Пример принимает туманное изображение в качестве входных данных и создает отключенное изображение. Этот пример является типичной реализацией алгоритма выпрямления тумана. В примере используются функции conv2, im2grey и imhist.
Необходимый
Этот пример генерирует CUDA ® MEX и имеет следующие требования к третьим лицам.
CUDA включает графический процессор NVIDIA ® и совместимый драйвер. Для генерации кода половинной точности графический процессор должен иметь минимальную вычислительную способность 6.0.
Дополнительный
Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Набор инструментальных средств NVIDIA.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации см. раздел «Оборудование сторонних производителей» и «Настройка продуктов для подготовки».
Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте coder.checkGpuInstall
функция.
envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);
fog_rectification
Функция точки входаФункция точки входа fog_rectification.m принимает туманное изображение как вход и возвращает отключенное изображение.
type fog_rectification
function [out] = fog_rectification(input) %#codegen % Copyright 2017-2019 The MathWorks, Inc. coder.gpu.kernelfun; % restoreOut is used to store the output of restoration restoreOut = zeros(size(input),'double'); % Changing the precision level of input image to double input = double(input)./255; %% Dark channel Estimation from input darkChannel = min(input,[],3); % diff_im is used as input and output variable for anisotropic diffusion diff_im = 0.9*darkChannel; num_iter = 3; % 2D convolution mask for Anisotropic diffusion hN = [0.0625 0.1250 0.0625; 0.1250 0.2500 0.1250; 0.0625 0.1250 0.0625]; hN = double(hN); %% Refine dark channel using Anisotropic diffusion. for t = 1:num_iter diff_im = conv2(diff_im,hN,'same'); end %% Reduction with min diff_im = min(darkChannel,diff_im); diff_im = 0.6*diff_im ; %% Parallel element-wise math to compute % Restoration with inverse Koschmieder's law factor = 1.0./(1.0-(diff_im)); restoreOut(:,:,1) = (input(:,:,1)-diff_im).*factor; restoreOut(:,:,2) = (input(:,:,2)-diff_im).*factor; restoreOut(:,:,3) = (input(:,:,3)-diff_im).*factor; restoreOut = uint8(255.*restoreOut); restoreOut = uint8(restoreOut); %% % Stretching performs the histogram stretching of the image. % im is the input color image and p is cdf limit. % out is the contrast stretched image and cdf is the cumulative prob. % density function and T is the stretching function. p = 5; % RGB to grayscale conversion im_gray = im2gray(restoreOut); [row,col] = size(im_gray); % histogram calculation [count,~] = imhist(im_gray); prob = count'/(row*col); % cumulative Sum calculation cdf = cumsum(prob(:)); % finding less than particular probability i1 = length(find(cdf <= (p/100))); i2 = 255-length(find(cdf >= 1-(p/100))); o1 = floor(255*.10); o2 = floor(255*.90); t1 = (o1/i1)*[0:i1]; t2 = (((o2-o1)/(i2-i1))*[i1+1:i2])-(((o2-o1)/(i2-i1))*i1)+o1; t3 = (((255-o2)/(255-i2))*[i2+1:255])-(((255-o2)/(255-i2))*i2)+o2; T = (floor([t1 t2 t3])); restoreOut(restoreOut == 0) = 1; u1 = (restoreOut(:,:,1)); u2 = (restoreOut(:,:,2)); u3 = (restoreOut(:,:,3)); % Replacing the value from look up table out1 = T(u1); out2 = T(u2); out3 = T(u3); out = zeros([size(out1),3], 'uint8'); out(:,:,1) = uint8(out1); out(:,:,2) = uint8(out2); out(:,:,3) = uint8(out3); return
Настройте вход для генерации кода и создайте строение для генерации кода GPU.
inputImage = imread('foggyInput.png'); cfg = coder.gpuConfig('mex');
Сгенерируйте fog_rectification_mex
Файл MEX при помощи codegen
команда.
codegen -args {inputImage} -config cfg fog_rectification -o fog_rectification_gpu_mex
Code generation successful: To view the report, open('codegen/mex/fog_rectification/html/report.mldatx').
Запустите сгенерированный fog_rectification_gpu_mex с туманным входным изображением, а затем постройте график туманных и дефоггированных изображений.
[outputImage] = fog_rectification_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, 'Foggy Input Image'); title(p2, 'Defogged Output Image');
Из-за архитектурных различий между центральным процессором и графическим процессором числовая верификация не всегда совпадает. Этот сценарий верен при использовании одного типа данных или при выполнении целого типа преобразования в коде MATLAB. В этом примере целый тип в fog_rectification.m
функция точки входа создает числовые различия с симуляцией MATLAB.
Расчеты в этом примере могут также выполняться в числах с половинной точностью и с плавающей точкой, используя fog_rectification_half_precision.m
функция точки входа. Чтобы сгенерировать и выполнить код с типами данных половинной точности, требуется вычислительная способность CUDA 6.0 или выше. Установите ComputeCapability
свойство объекта строения кода, чтобы '6.0'
. Для половинной точности режим выделения памяти (malloc) для генерации кода CUDA должен быть установлен на 'Discrete'.
inputImage = half(imread('foggyInput.png')); cfg = coder.gpuConfig('mex'); cfg.GpuConfig.ComputeCapability = '6.0'; cfg.GpuConfig.MallocMode = 'Discrete'; codegen -args {inputImage} -config cfg fog_rectification_half_precision -o fog_rectification_gpu_mex
Code generation successful: To view the report, open('codegen/mex/fog_rectification_half_precision/html/report.mldatx').
codegen
| coder.checkGpuInstall
| coder.gpu.constantMemory
| coder.gpu.kernel
| coder.gpu.kernelfun
| gpucoder.matrixMatrixKernel
| gpucoder.stencilKernel