exponenta event banner

Формирование изображения оптического датчика

Формирование изображения оптического датчика на основе смоделированных данных движения

В этом примере показано, как создать фильм с 64 кадрами и размером кадра 64 на 64 пикселя (со скоростью 10 кадров в секунду). Фильм содержит моделирование движущейся цели, которая движется через структурированный фон, который сам движется. Также генерируется дрожание, вызванное случайной вибрацией (в модели Simulink ® под названием «aero_vibrati"»), и дрожание добавляется в общее движение датчика. Наконец, изображение размыто через функцию расширения оптической точки Гаусса.

Примечание.Изменение делт здесь также требует изменения в диалоговом окне настройки параметров в модели Simulink «вибрация».

delt = 0.1;      % Sample time of the generated sequence
num_frames= 64;  % Number of frames to generate
framesize = 64;  % Square frame size in pixels

out = zeros(framesize,framesize,num_frames);    % Initialize movie storage as a 3D Array

Создание цели и определение ее движения

Первый этап состоит в определении формы и движения целевого объекта. Выбранная форма является большим знаком плюс, и изображение определяется матрицей, представляющей интенсивность изображения в каждой позиции пикселя. Цель определяется как перемещающаяся от центра к нижнему правому краю изображения.

target = [zeros(3,11)
          zeros(1,5) 6 zeros(1,5)
          zeros(1,5) 6 zeros(1,5)
          zeros(1,3) 6 6 6 6 6 zeros(1,3) % Target is a plus sign 5 by 5 pixels across
          zeros(1,5) 6 zeros(1,5)         %  with an intensity of 6 (S/N ratio is ~4).
          zeros(1,5) 6 zeros(1,5)         % The total target image is made on an 11x11 grid to
          zeros(3,11)];                   %  allow the image to be interpolated without error.

target_velx = 1;                 % target velocity in x direction in pixels per second
target_vely = 1;                 % target velocity in y direction in pixels per second
target_x_initially = framesize/2; % the target is initially in the center of the frame in x
target_y_initially = framesize/2; % and in y

figure(1);
colormap('gray');
image(target*32);
title('Target Image')

Построение фонового и целевого составного изображения

Создать синусоидально коррелированный фон и дать ему движение дрейфа. Затем наложите цель на фоновое изображение.

backsize = framesize+36;  % Make the background bigger than the frame so when it
                          % drifts there are new pixels available to drift into.
xygrid = (1:backsize)/backsize;
B=2*sin(2*pi*xygrid).^2'*cos(2*pi*xygrid).^2;

psd = fft2(B);
psd = real(psd.*conj(psd));

background = B + 0.5*randn(backsize);    % Add a specular Gaussian white
					 % sequence to the structure with
					 % variance of 0.25  (sigma of 0.5).

xoff = 10;
yoff = 10;     % Sensor location is offset from the 0,0 of the background
driftx = 1;
drifty = 1;    % drift rate of the background in a and y directions pix/sec.

minout = min(min(min(background)));
maxout = max(max(max(background)));
colormap('gray');
image((background-minout)*64/(maxout-minout))
title('Background image with additive white specular noise')

Моделирование вращательной вибрации трекера

Вращательная вибрация трекера моделируется с помощью модели aero_vibrati. Данные, необходимые для моделирования вибрации трекера, генерируются при запуске модели Simulink «» aero_vibrati.

Запустите модель вибрации Simulink с помощью команды sim (Примечание - если делт изменяется от 0,1 секунды, модель Simulink также должна быть изменена, чтобы время выборки для вибрации соответствовало времени выборки в этой модели изображения трекера.

Полученные случайные повороты показаны на фиг.1.

omega = 2*pi*5;       % The structural frequencies are 5, 10 and 15 Hz in the model.
zeta  = 0.01;         % Damping ratio for all modes

open_system('aero_vibrati')
simout = sim('aero_vibrati','SrcWorkspace','current');

vibdat = simout.get('vibdat');          % The Simulink model "aero_vibrati"
                                        % generates the vibration data at
                                        % a sample time of 0.01 sec.
vibx = vibdat(1:10:1000);               % The output of simulation is
                                        % returned as the variable simout
                                        % The variable simout contains
viby = vibdat(1001:10:2000);            % the in array vibdat that contains
                                        % the vibration data

levarmx = 10;   % Rotational lever arm for vibration noise in x
levarmy = 10;   %  and in y.

subplot(211);
plot(0.01*(1:10:1000),vibx);grid;
title('Time history of the random Tracker rotations')
xlabel('Time');ylabel('x direction')

subplot(212);
plot(0.01*(1:10:1000),viby);grid;
xlabel('Time');ylabel('y direction')

Моделирование эффектов движения из фона, цели и дрожания

Кадры, которые будут составлять фильм, теперь создаются и хранятся в многомерном массиве (out). Каждый кадр имеет фон и цель в различных положениях из-за движения цели, дрейфа фона и вибрации трекера. Первый кадр фильма будет показан на фиг.1.

clf; drawnow;

for t = 1:num_frames

  % Drift the Background at the rate driftx and drifty
  % (in pixels/second) and add in the vibration:
  xshift = driftx*delt*t+levarmx*vibx(t,1);
  yshift = drifty*delt*t+levarmy*viby(t,1);

  % Interpolate the 2D image using the MATLAB(R) function interp2:
  [xgrid, ygrid]   = meshgrid(1:backsize);
  [xindex, yindex] = meshgrid(xshift:1:xshift+backsize,yshift:1:yshift+backsize);
  outtemp = interp2(xgrid,ygrid,background,xindex,yindex);

  % Truncate the drifted image down from backsize to framesize:
  out(:,:,t) = outtemp(xoff:xoff+framesize-1,xoff:xoff+framesize-1);

  % Now let the target move also:
  tpixinx = floor(target_velx*delt*t);
  tpixiny = floor(target_vely*delt*t);  % Before interpolating extract the number of pixels moved
  txi = target_velx*delt*t - tpixinx;
  tyi = target_vely*delt*t - tpixiny;   % Interpolate on sub-pixels around the origin only
  [txgrid tygrid] = meshgrid(1:11);     % meshgrid here generates a matrix of grid elements
  [txi tyi] = meshgrid(txi+1:txi+11,tyi+1:tyi+11); % meshgrid generates 2 matrices with the x and y grids

  % Interpolate the intensity values first using interp2 -- a built in MATLAB command
  temp = interp2(txgrid,tygrid,target,txi,tyi);

  % Insert the target at the location determined by the initial offset, and the number of whole pixels moved
  tx = tpixinx + target_x_initially-1;
  ty = tpixiny + target_y_initially-1;
  out(tx:tx+6,ty:ty+6,t) = temp(9:-1:3,9:-1:3) + out(tx:tx+6,ty:ty+6,t);

end

minout = min(min(min(out)));
maxout = max(max(max(out)));
colormap('gray');
image((out(:,:,1)-minout) * 64/(maxout-minout));
title('First frame of combined target and background image.')

Пропускать изображения через оптику - используйте гауссовскую «функцию апертуры»

Этот сегмент кода может также легко использовать функцию измеренной апертуры - просто замените следующие пять строк на «load» measured_aperture где measured_aperture - измеренная функция, сохраненная в ASCII, а данные, сохраненные в файле measured_aperture.mat, - это файл MATLAB ® .mat, содержащий apfunction матрицы. (в MATLAB типа «help load» для использования загрузки и просмотра кода c и fortran, который показывает, как читать и писать файлы MATLAB .mat).

(Примечание: Если функция точечного разброса является гауссовой, то и функция апертуры.)

Для моделирования эффекта оптики трекера каждый из кадров фильма теперь размыт с помощью 2-D БПФ (быстрого преобразования Фурье). Первый кадр полученного изображения показан на фиг.1.

x = 1:framesize;
y = 1:framesize;
sigma      = 120;
apfunction = exp(-(x-framesize/2).^2/(2*sigma))' * exp(-(y-framesize/2).^2/(2*sigma));
apfunction = fftshift(apfunction);      % Rotate so it conforms with FFT convention

for j = 1:num_frames
  out(:,:,j) = real(ifft2(apfunction.*fft2(out(:,:,j))));
end

minout = min(min(min(out)));
maxout = max(max(max(out)));
colormap('gray');
image((out(:,:,1)-minout)*64/(maxout-minout));
title('First frame of blurred image.')

Создание фильма MATLAB ® и воспроизведение его назад

Масштабируйте кадр фильма так, чтобы он имел 64 значения интенсивности от минимума до максимума, а затем отобразите результат в виде изображения. См. справку по MATLAB для получения информации о работе движущегося и получаемого кадра.

minout = min(min(min(out)));
maxout = max(max(max(out)));

M = moviein(num_frames);
for j = 1:num_frames
  image((out(:,:,j)-minout)*64/(maxout-minout))
  drawnow
  M(:,j) = getframe;
end

% colormap('gray')
% movie(M);

(НЕОБЯЗАТЕЛЬНО) Сохраните фильм в файле .mat

При необходимости можно сохранить созданный фильм трекера в файле мата, а также сохранить psd фона для последующего использования с фильмом.

save trackerimage out
save psdback psd
save moviedat M
bdclose('aero_vibrati');

Связанные темы