このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ハイ ダイナミック レンジ イメージング
この例では、ハイ ダイナミック レンジ イメージング アルゴリズムを実装する MATLAB® 設計からの HDL コードの生成方法を示します。
アルゴリズム
ハイ ダイナミック レンジ イメージング (HDRI または HDR) は、イメージ処理や写真撮影で使用される一連の技法で、現在の標準的なデジタル イメージ処理や写真撮影の技法よりも広いダイナミック レンジ (イメージの最も明るい部分から最も暗い部分までの範囲) に対応しています。HDR イメージでは、直射日光からかすかな星明かりまで、実際の光景における強度レベルの範囲をより正確に表現でき、多くの場合は同じ対象について露出が異なる複数の画像をキャプチャします。
MATLAB 設計
design_name = 'mlhdlc_hdr'; testbench_name = 'mlhdlc_hdr_tb';
関数 dbtype
を使用して MATLAB 設計のコンテンツを表示します。
dbtype(design_name);
1 function [valid_out, x_out, y_out, ... 2 HDR1, HDR2, HDR3] = mlhdlc_hdr(YShort1, YShort2, YShort3, ... 3 YLong1, YLong2, YLong3, ... 4 plot_y_short_in, plot_y_long_in, ... 5 valid_in, x, y) 6 % 7 8 % Copyright 2013-2015 The MathWorks, Inc. 9 10 % This design implements a high dynamic range imaging algorithm. 11 12 plot_y_short = plot_y_short_in; 13 plot_y_long = plot_y_long_in; 14 15 %% Apply Lum(Y) channels LUTs 16 y_short = plot_y_short(uint8(YShort1)+1); 17 y_long = plot_y_long(uint8(YLong1)+1); 18 19 y_HDR = (y_short+y_long); 20 21 %% Create HDR Chorm channels 22 % HDR per color 23 24 HDR1 = y_HDR * 2^-8; 25 HDR2 = (YShort2+YLong2) * 2^-1; 26 HDR3 = (YShort3+YLong3) * 2^-1; 27 28 %% Pass on valid signal and pixel location 29 30 valid_out = valid_in; 31 x_out = x; 32 y_out = y; 33 34 end
dbtype(testbench_name);
1 2 % 3 4 % Copyright 2013-2015 The MathWorks, Inc. 5 6 % Clean screen and memory 7 close all 8 clear mlhdlc_hdr 9 set(0,'DefaultFigureWindowStyle','docked') 10 11 12 %% Read the two exposed images 13 14 short = imread('mlhdlc_hdr_short.tif'); 15 long = imread('mlhdlc_hdr_long.tif'); 16 17 % define HDR output variable 18 HDR = zeros(size(short)); 19 [height, width, color] = size(HDR); 20 21 set(0,'DefaultFigureWindowStyle' , 'normal') 22 figure('Name', [mfilename, '_plot']); 23 subplot(1,3,1); 24 imshow(short, 'InitialMagnification','fit'), title('short'); 25 26 subplot(1,3,2); 27 imshow(long, 'InitialMagnification','fit'), title('long'); 28 29 30 %% Create the Lum(Y) channels LUTs 31 % Pre-process 32 % Luminance short LUT 33 ShortLut.x = [0 16 45 96 255]; 34 ShortLut.y = [0 20 38 58 115]; 35 36 % Luminance long LUT 37 LongLut.x = [ 0 255]; 38 LongLut.y = [ 0 140]; 39 40 % Take the same points to plot the joined Lum LUT 41 plot_x = 0:1:255; 42 plot_y_short = interp1(ShortLut.x,ShortLut.y,plot_x); %LUT short 43 plot_y_long = interp1(LongLut.x,LongLut.y,plot_x); %LUT long 44 45 %subplot(4,1,3); 46 %plot(plot_x, plot_y_short, plot_x, plot_y_long, plot_x, (plot_y_long+plot_y_short)), grid on; 47 48 49 %% Create the HDR Lum channel 50 % The HDR algorithm 51 % read the Y channels 52 53 YIQ_short = rgb2ntsc(short); 54 YIQ_long = rgb2ntsc(long); 55 56 %% Stream image through HDR algorithm 57 58 for x=1:width 59 for y=1:height 60 YShort1 = round(YIQ_short(y,x,1)*255); %input short 61 YLong1 = round(YIQ_long(y,x,1)*255); %input long 62 63 YShort2 = YIQ_short(y,x,2); %input short 64 YLong2 = YIQ_long(y,x,2); %input long 65 66 YShort3 = YIQ_short(y,x,3); %input short 67 YLong3 = YIQ_long(y,x,3); %input long 68 69 valid_in = 1; 70 71 [valid_out, x_out, y_out, HDR1, HDR2, HDR3] = mlhdlc_hdr(YShort1, YShort2, YShort3, YLong1, YLong2, YLong3, plot_y_short, plot_y_long, valid_in, x, y); 72 73 % use x and y to reconstruct image 74 if valid_out == 1 75 HDR(y_out,x_out,1) = HDR1; 76 HDR(y_out,x_out,2) = HDR2; 77 HDR(y_out,x_out,3) = HDR3; 78 end 79 end 80 end 81 82 %% plot HDR 83 HDR_rgb = ntsc2rgb(HDR); 84 subplot(1,3,3); 85 imshow(HDR_rgb, 'InitialMagnification','fit'), title('hdr ');
設計のシミュレーション
コードの生成前にテスト ベンチを使用して設計のシミュレーションを実行し、実行時エラーが発生しないことを常に確認することをお勧めします。
mlhdlc_hdr_tb
HDL Coder™ プロジェクトの新規作成
coder -hdlcoder -new mlhdlc_hdr_prj
次に、'mlhdlc_hdr.m' ファイルを [MATLAB 関数] としてプロジェクトに追加し、'mlhdlc_hdr_tb.m' を [MATLAB テスト ベンチ] として追加します。
MATLAB HDL Coder プロジェクトの作成と入力に関する詳細なチュートリアルについては、MATLAB から HDL へのワークフロー入門を参照してください。
定数のパラメーター入力の作成
この例では、定数のパラメーター入力の受け渡しを使用する方法を示します。
この設計の入力パラメーターである 'plot_y_short_in' と 'plot_y_long_in' は定数の入力パラメーターです。入力の型を変更して 'constant(double(1x256))' として定義できます。
'plot_y_short_in' と 'plot_y_short_in' は LUT 入力です。設計には double の入力として定数畳み込みされます。これらの 2 つの入力パラメーターについての端子の宣言は生成される HDL コードには含まれません。
設計 'mlhdlc_hdr.m' の内部では、これらの変数が固定小数点に適切に変換されるように再度代入されることに注意してください。これは、たとえば変数のサイズを定義する場合など、ロジック以外の部分で純粋に定数として使用する場合は必要ありません。
固定小数点変換と HDL コード生成の実行
HDL アドバイザーを起動し、[コード生成] のステップを右クリックして [選択したタスクまで実行] オプションを選択し、最初から HDL コード生成までのすべてのステップを実行します。
固定小数点への設計の変換と HDL コードの生成
設計を固定小数点に変換し、HDL コードとテスト ベンチを生成するスクリプトを次に示します。
exArgs = {0,0,0,0,0,0,coder.Constant(ones(1,256)),coder.Constant(ones(1,256)),0,0,0}; fc = coder.config('fixpt'); fc.TestBenchName = 'mlhdlc_hdr_tb'; hc = coder.config('hdl'); hc.GenerateHDLTestBench = true; hc.SimulationIterationLimit = 1000; % Limit number of testbench points codegen -float2fixed fc -config hc -args exArgs mlhdlc_hdr
コード生成ログのウィンドウにあるハイパーリンクをクリックして、生成された HDL コードを確認します。