算法/代码应该做些什么改变才能获得预期的车辆形状?

时间:2015-05-28 03:47:15

标签: algorithm matlab image-processing fft issue-tracking

我正在开展图像处理项目,该项目基于仅相位重建的重要性。有关更多信息,您可以在https://dsp.stackexchange.com/questions/16462/how-moving-part-pixel-intensity-values-of-video-frames-becomes-dominant-compared

中阅读geometrikal给出的答案

我想

  

video of traffic on road检测移动物体(请通过(步骤1)点击播放按钮下载1.47 MB​​视频然后(步骤2)右击视频然后(步骤3)点击另存为选项)

算法是

建议的方法

要求:从视频中提取的输入图像序列I(x,y,n)(其中x和y是图像尺寸,n表示视频中的帧编号)。

结果:每帧移动物体的分割蒙版

  
      
  1. 对于输入视频中的每个帧执行步骤2,将第2步结果附加到结果数组'I(x,y,n)'

  2.   
  3. 使用2D高斯滤波器使当前帧平滑

  4.   
  5. 使用(Eq.4.1)

  6. 对整个序列I(x,y,n)执行3D FFT   
  7. 使用3D DFT的实部和虚部计算相位谱

  8.   
  9. 使用(公式4.2)计算重建序列Î(x,y,n)

  10.   
  11. 对于输入视频中的每个帧执行步骤7到步骤10以获得每个帧的分段掩码并附加步骤10导致得到的分段掩码阵列BW(x,y,n)'

    < / LI>   
  12. 使用平均滤波器平滑重建的Î(x,y,n)帧。

  13.   
  14. 计算当前帧的平均值

  15.   
  16. 使用平均值作为阈值

  17. 将当前帧转换为二进制图像   
  18. 进行形态处理,即填充和关闭,以获得当前帧的移动物体的分段遮罩

  19.   
  20. 结束算法。

  21.   

通过上述算法,我可以从视频中找到所有移动物体。

但问题是我获得的车辆分段面罩没有我想要的正确形状。

example moving object segmentation

那么有人可以帮助我获得预期的形状吗?

  
      
  1. 我应该在算法中做出哪些更改?
  2.   

  
      
  1. 我应该在MATLAB代码中做出哪些更改?
  2.   
    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

1 个答案:

答案 0 :(得分:1)

我不明白算法的细节(顺便说一下,你可以通过使用比f1,f2,f7,mean1,mean2等更有意义的名字来获得可见性)但似乎你的问题是固有的技术使用。

通过使用FFT相位,您可以在每个像素上独立工作,而不需要任何轮廓感知。你可以做的是调整一点阈值(在这里固定的平均值)并看看它是如何响应的。

另一个选择是通过尝试识别图像中的预期形状来发布处理当前结果(请参阅最大期望算法)。

你的约束是什么?