Этот пример показывает использование функций обработки изображений для генерации кода графического процессора. Пример берет туманное изображение, как введено и производит изображение defogged. Этим примером является типичная реализация алгоритма исправления вуали. Пример использует conv2, rgb2gray, и функции imhist.
CUDA включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
Image Processing Toolbox™.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов.
Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно, используйте coder.checkGpuInstall
функция.
envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);
fog_rectification
Функция точки входаfog_rectification.m функция точки входа берет туманное изображение, как введено и возвращает q defogged изображение.
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=rgb2gray(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
Настройте вход для генерации кода и создайте настройку для генерации кода графического процессора.
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 с туманным входным изображением, и затем постройте изображения defogged и туманное.
[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. В этом примере, преобразовании целочисленного типа в for_rectification.m
функция точки входа производит числовые различия для симуляции MATLAB.
Расчеты в этом примере могут также быть сделаны в числах с плавающей точкой полуточности, с помощью fog_rectification_half_precision.m функции точки входа. Чтобы сгенерировать и выполнить код с типами данных полуточности, CUDA вычисляют возможность 5,3, или выше требуется. Установите ComputeCapability
свойство настройки кода возражает против '5.3'
. Для полуточности выделение памяти (malloc) режим для генерации кода CUDA должно быть установлено в 'Дискретный'.
inputImage = half(imread('foggyInput.png')); cfg = coder.gpuConfig('mex'); cfg.GpuConfig.ComputeCapability = '5.3'; 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').