Обработка изображений расширенного динамического диапазона

В этом примере показано, как сгенерировать HDL-код из проекта MATLAB®, который реализует расширенный динамический диапазон алгоритм обработки изображений.

Алгоритм

Обработка изображений Расширенного динамического диапазона (HDRI или HDR) является набором методов, используемых в обработке изображений и фотографии, чтобы позволить больший динамический диапазон между самыми легкими и самыми темными областями изображения, чем текущие стандартные цифровые методы обработки изображений или фотографические методы. Изображения HDR могут представлять более точно область значений уровней яркости, найденных в действительных сценах, от прямого солнечного света, чтобы ослабеть звездный свет, и часто получаются посредством множества по-другому отсоединенных изображений той же темы.

Проект MATLAB

design_name = 'mlhdlc_hdr';
testbench_name = 'mlhdlc_hdr_tb';

Давайте смотреть на проект 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    figure('Name', [mfilename, '_plot']);
22    subplot(1,3,1);
23    imshow(short, 'InitialMagnification','fit'), title('short');
24    
25    subplot(1,3,2);
26    imshow(long, 'InitialMagnification','fit'), title('long');
27    
28    
29    %% Create the Lum(Y) channels LUTs
30    % Pre-process
31    % Luminance short LUT
32    ShortLut.x = [0    16    45    96   255];
33    ShortLut.y = [0    20    38    58   115];
34    
35    % Luminance long LUT
36    LongLut.x = [ 0 255];
37    LongLut.y = [ 0  140];
38    
39    % Take the same points to plot the joined Lum LUT
40    plot_x = 0:1:255;
41    plot_y_short = interp1(ShortLut.x,ShortLut.y,plot_x); %LUT short
42    plot_y_long = interp1(LongLut.x,LongLut.y,plot_x); %LUT long
43    
44    %subplot(4,1,3);
45    %plot(plot_x, plot_y_short, plot_x, plot_y_long, plot_x, (plot_y_long+plot_y_short)), grid on;
46    
47    
48    %% Create the HDR Lum channel 
49    % The HDR algorithm
50    % read the Y channels 
51    
52    YIQ_short = rgb2ntsc(short);
53    YIQ_long = rgb2ntsc(long);
54    
55    %% Stream image through HDR algorithm
56    
57    for x=1:width
58        for y=1:height
59            YShort1 = round(YIQ_short(y,x,1)*255); %input short
60            YLong1 = round(YIQ_long(y,x,1)*255); %input long
61    
62            YShort2 = YIQ_short(y,x,2); %input short
63            YLong2 = YIQ_long(y,x,2); %input long
64    
65            YShort3 = YIQ_short(y,x,3); %input short
66            YLong3 = YIQ_long(y,x,3); %input long
67    
68            valid_in = 1;
69            
70            [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);
71    
72            % use x and y to reconstruct image
73            if valid_out == 1
74                HDR(y_out,x_out,1) = HDR1;
75                HDR(y_out,x_out,2) = HDR2;
76                HDR(y_out,x_out,3) = HDR3;
77            end   
78        end
79    end
80    
81    %% plot HDR
82    HDR_rgb = ntsc2rgb(HDR);
83    subplot(1,3,3);
84    imshow(HDR_rgb, 'InitialMagnification','fit'), title('hdr ');

Симулируйте проект

Это всегда - хорошая практика, чтобы симулировать проект с испытательным стендом до генерации кода, чтобы убедиться, что нет никаких ошибок периода выполнения.

mlhdlc_hdr_tb

Setup для примера

Выполнение следующих линий копирует необходимые файлы во временную папку

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_hdr'];

% create a temporary folder and copy the MATLAB files
cd(tempdir);
[~, ~, ~] = rmdir(mlhdlc_temp_dir, 's');
mkdir(mlhdlc_temp_dir);
cd(mlhdlc_temp_dir);

% copy files to the temp dir
copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, 'mlhdlc_hdr_long.tif'), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, 'mlhdlc_hdr_short.tif'), mlhdlc_temp_dir);

Создайте новый проект HDL Coder™

coder -hdlcoder -new mlhdlc_hdr_prj

Затем добавьте файл 'mlhdlc_hdr.m' в проект как функция MATLAB и 'mlhdlc_hdr_tb.m' как Испытательный стенд MATLAB.

Можно обратиться к Началу работы с MATLAB к примеру по Рабочему процессу HDL для более полного примера при создании и заполнении проектов HDL Coder MATLAB.

Создание постоянных входных параметров параметра

Этот пример показывает, чтобы использовать передачу постоянные входные параметры параметра.

В этом проекте входные параметры 'plot_y_short_in' и 'plot_y_long_in' являются постоянными входными параметрами. Можно задать их соответственно путем изменения входных типов как 'постоянных (дважды (1x256))'

'plot_y_short_in' и 'plot_y_short_in' являются входными параметрами LUT. Они постоянные свернутый как двойные входные параметры к проекту. Вы не будете видеть объявления порта для этих двух входных параметров в сгенерированном 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-код путем нажатия на гиперссылки в окне Code Generation Log.

Очистите Сгенерированные Файлы

Можно запустить следующие команды, чтобы очистить временную папку проекта.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_hdr'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');