最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

霧の修正

この例では、GPU コード生成にイメージ処理関数を使用する方法を示します。この例では、霧のかかったイメージを入力として受け取り、霧が取り除かれたイメージを生成します。これは霧修正アルゴリズムの一般的な実装です。この例では、関数 conv2、rgb2gray、および imhist を使用します。サポートされる関数のすべての一覧については、GPU Coder™ のドキュメンテーションを参照してください。

必要条件

  • Compute Capability 3.2 以上の CUDA® 対応 NVIDIA® GPU。

  • NVIDIA CUDA ツールキット。

  • Image Processing Toolbox

  • コンパイラおよびライブラリの環境変数。詳細は、Environment Variables を参照してください。

フォルダーの作成と関連ファイルのコピー

次のコード行は、現在の作業フォルダー (pwd) にフォルダーを作成し、すべての関連ファイルをこのフォルダーにコピーします。この操作を実行したくない、またはこのフォルダーにファイルを生成できない場合、現在の作業フォルダーを変更してください。

gpucoderdemo_setup('gpucoderdemo_fog_rectification');

GPU 環境の検証

関数 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 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;
 % rgbtograyconversion
 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

CUDA コードと MEX 関数の生成

コード生成の入力を設定し、GPU コード生成用の構成を作成します。

inputImage = imread('foggyInput.png');
cfg = coder.gpuConfig('mex');

コード生成の実行

codegen コマンドを使用して、MEX 'fog_rectification_mex' を生成します。

codegen -args {inputImage} -config cfg fog_rectification -o fog_rectification_gpu_mex

霧のかかったイメージを使用した 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');

コマンドの実行: クリーンアップ

一時ファイルを削除し、元のフォルダーに戻します。

cleanup