Устранение тумана

Этот пример показывает использование функций обработки изображений для генерации кода GPU. Пример принимает туманное изображение в качестве входных данных и создает отключенное изображение. Этот пример является типичной реализацией алгоритма выпрямления тумана. В примере используются функции conv2, im2grey и imhist.

Необходимые условия для третьих лиц

Необходимый

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

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

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

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

Проверьте окружение GPU

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

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

The 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

Сгенерируйте код CUDA и MEX-функцию

Настройте вход для генерации кода и создайте строение для генерации кода 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').

Запуск MEX-функции с туманным изображением

Запустите сгенерированный 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').

См. также

Функции

Объекты

Похожие темы