Я работаю над проектом по обработке изображений, который основан на важности реконструкции только фазы. Для получения дополнительной информации вы можете прочитать ответ, данный geometrikal в https://dsp.stackexchange.com/questions/16462/how-moving-part-pixel-intensity-values-of-video-frames-becomes-доминантноесравнение
Проект состоит из 2 частей.
Обнаружение движущихся объектов из видео о дорожном движении (загрузите видео размером 1,47 МБ ( шаг 1) ) нажмите кнопку воспроизведения, затем (шаг 2) щелкните правой кнопкой мыши видео, затем (шаг 3) нажмите кнопку «Сохранить как»)
Выполните отслеживание любого отдельного движущегося объекта из видео.
Сейчас я вполне успешно справился с 1-й частью проекта. Алгоритм для этого таков:
Алгоритм №1 Предлагаемый подход
Требование: входная последовательность изображений I(x, y, n) (где x и y — размеры изображения, а n — номер кадра в видео), которая извлекается из видео.
Результат: Маска сегментации движущегося объекта для каждого кадра
Для каждого кадра входного видео выполните шаг 2, добавьте результат шага 2 в результирующий массив «I (x, y, n)».
Сглаживание текущего кадра с помощью 2D-фильтра Гаусса
Выполните трехмерное БПФ для всей последовательности I(x, y, n), используя (уравнение 4.1)
Рассчитайте фазовый спектр, используя действительную и мнимую части 3D DFT.
Рассчитайте реконструированную последовательность Î(x, y, n), используя (уравнение 4.2)
Для каждого кадра входного видео выполните шаги с 7 по 10, чтобы получить маску сегментации для каждого кадра, и добавьте шаг 10, чтобы получить результирующий массив масок сегментации BW(x,y,n)».
Сгладьте восстановленный кадр Î(x, y, n) с помощью усредняющего фильтра.
Вычислить среднее значение текущего кадра
Преобразуйте текущий кадр в бинарное изображение, используя среднее значение в качестве порога
Выполните морфологическую обработку, т.е. заполнение и закрытие, чтобы получить сегментированную маску движущегося объекта для текущего кадра.
Конечный алгоритм.
С помощью приведенного выше алгоритма я смог найти все движущиеся объекты из видео. Теперь я хочу перейти ко второй части, т.е. выполнить отслеживание любого отдельного движущегося объекта из видео.
Как вы можете видеть на рисунке, я достиг результатов, показанных в 1-м столбце. Я достиг только результатов 1-го столбца. Но моя цель – отследить одно транспортное средство, как показано во 2-м столбце рисунка. (Результаты, показанные во 2-м столбце, были получены с помощью Photoshop)
Так кто-нибудь может мне помочь?
tic
clc;
clear all;
close all;
%read video file
video = VideoReader('D:\dvd\Matlab code\test videos\5.mp4');
T= video.NumberOfFrames ; %number of frames%
frameHeight = video.Height; %frame height
frameWidth = video.Width ; %frameWidth
get(video); %return graphics properties of video
i=1;
for t=300:15:550 %select frames between 300 to 550 with interval of 15 from the video
frame_x(:,:,:,i)= read(video, t);
frame_y=frame_x(:,:,:,i);
%figure,
%imshow(f1),title(['test frames :' num2str(i)]);
frame_z=rgb2gray(frame_y); %convert each colour frame into gray
frame_m(:,:,:,i)=frame_y; %Store colour frames in the frame_m array
%Perform Gaussian Filtering
h1=(1/8)*(1/8)*[1 3 3 1]'*[1 3 3 1] ; % 4*4 Gaussian Kernel
convn=conv2(frame_z,h1,'same');
g1=uint8(convn);
Filtered_Image_Array(:,:,i)=g1; %Store filtered images into an array
i=i+1;
end
%Apply 3-D Fourier Transform on video sequences
f_transform=fftn(Filtered_Image_Array);
%Compute phase spectrum array from f_transform
phase_spectrum_array =exp(1j*angle(f_transform));
%Apply 3-D Inverse Fourier Transform on phase spectrum array and
%reconstruct the frames
reconstructed_frame_array=(ifftn(phase_spectrum_array));
k=i;
i=1;
for t=1:k-1
%Smooth the reconstructed frame of Î(x, y, n) using the averaging filter.
Reconstructed_frame_magnitude=abs(reconstructed_frame_array(:,:,t));
H = fspecial('disk',4);
circular_avg(:,:,t) = imfilter(Reconstructed_frame_magnitude,H);
%Convert the current frame into binary image using mean value as the threshold
mean_value=mean2(circular_avg(:,:,t));
binary_frame = im2bw(circular_avg(:,:,t),1.6*mean_value);
%Perform Morphological operations
se = strel('square',3);
morphological_closing = imclose(binary_frame,se);
morphological_closing=imclearborder(morphological_closing); %clear noise present at the borders of the frames
%Superimpose segmented masks on it's respective frames to obtain moving
%objects
moving_object_frame = frame_m(:,:,:,i);
moving_object_frame(morphological_closing) = 255;
figure,
imshow(moving_object_frame,[]), title(['Moving objects in Frame :' num2str(i)]);
i=i+1;
end
toc