目录
1.算法仿真效果
matlab2022a仿真结果如下:
2.MATLAB核心程序
........................................................
tic;
len = 76;
sizes = 128; %图片缩小比例,越小处理速度越快。由于3D图非常耗资源,所以得小点。。
areas = min(64,sizes);%光流场计算范围缩放
sel = 1;%是否显示原三维图
%1.读取图像数据
%1.读取图像数据
for pp = 1:10
pp
%读取连续的图片
if pp <= 9
str1 = ['CT_PIC\Export000',num2str(pp),'\SR0000']
str2 = ['CT_PIC\Export000',num2str(pp),'\SR0000\*.jpg']
else
str1 = ['CT_PIC\Export00',num2str(pp),'\SR0000']
str2 = ['CT_PIC\Export00',num2str(pp),'\SR0000\*.jpg']
end
folder = str1;
list = dir(str2);
I2 = func_read_serial_pic(folder,list,len,sizes);
for i = 1:length(I2)
D(:,:,i) = I2{i};
end
Images{pp} = D;
end
%显示三维图像
for pp = 1:10
[x,y,z,D] = reducevolume(Images{pp},[1,1,1]);
D = smooth3(D);
if sel == 1
figure;
p = patch(isosurface(x,y,z,D, 1,'verbose'), 'FaceColor', 'red', 'EdgeColor', 'none');
p2 = patch(isocaps(x,y,z,D, 5), 'FaceColor', 'interp', 'EdgeColor', 'none');
view(3);
axis square;
daspect([1 1 .4])
colormap(gray(100))
camlight;
lighting gouraud
isonormals(x,y,z,D,p2);
end
pause(0.01);
end
%2计算光流场
%2计算光流场
for i = 2:10
[u,v,w]=func_cal_demons(Images{i-1},Images{i},1);
U{i-1} = u;
V{i-1} = v;
W{i-1} = w;
end
%显示三维光流场
step = 4;
[x,y,z] = meshgrid(1:step:sizes,1:step:sizes,1:len);
for k = 1:9
figure;
for j = [10,20,30,40,50,60,70]%设置这个参数,可以减少或增加显示的数目,方便观察
quiver3(x(:,:,j),y(:,:,j),z(:,:,j),U{k}(1:step:sizes,1:step:sizes,j),V{k}(1:step:sizes,1:step:sizes,j),W{k}(1:step:sizes,1:step:sizes,j));
axis([0,sizes,0,sizes,-5,80]);
hold on
end
hold off
pause(1);
end
%3数据输出
%注意,MATLAB可将图像直接保存为ascii数据,然后你在Tecplot中进行调用
%4.计算时间统计分析
toc;
%5.释放存储空间,退出程序,这个步骤注释掉,方便观察每个步骤产生的数据;
%clc;
%clear all;
09_027_m
代码设计简要说明及每个步骤的仿真时间:
·连续图片的读取
其对应的代码为:
通过这种方法,可以从一组连续的图片进行快速的读取。
·基于切片的三维视图生成
这个部分的代码,主要是生成立体的心脏图片,其仿真结果如下所示:
·单帧三维视图的光流数据计算
这个部分是整个系统的核心部分,其主要理论依据是我们提供的参考文献中的HS法,其实现的计算公式为:
3.算法涉及理论知识概要
1950年,Gibson首先提出了光流的概念,所谓光流就是指图像表现运动的速度。物体在运动的时候之所以能被人眼发现,就是因为当物体运动时,会在人的视网膜上形成一系列的连续变化的图像,这些变化信息在不同时间,不断的流过眼睛视网膜,就好像一种光流过一样,故称之为光流。光流法检测运动物体的原理:首先给图像中每个像素点赋予一个速度矢量(光流),这样就形成了光流场。如果图像中没有运动物体,光流场连续均匀,如果有运动物体,运动物体的光流和图像的光流不同,光流场不再连续均匀。从而可以检测出运动物体及位置。
应用背景:
根据图像前景和背景的运动,检测视频的变化,空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。可以用来检测运动抖动物体
关键技术:
当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流(optical flow)。
光流法(Optical flow or optic flow)是关于视域中的物体运动检测中的概念。用来描述相对于观察者的运动所造成的观测目标、表面或边缘的运动。光流法在样型识别、计算机视觉以及其他影像处理领域中非常有用,可用于运动检测、物件切割、碰撞时间与物体膨胀的计算、运动补偿编码,或者通过物体表面与边缘进行立体的测量等等。
光流场,它是指图像中所有像素点构成的一种二维(2D)瞬时速度场,其中的二维速度矢量是景物中可见点的三维速度矢量在成像表面的投影。
所以光流不仅包含了被观察物体的运动信息,而且还包含有关景物三维结构的丰富信息"
光流的概念:(Optical flow or optic flow)
它是一种运动模式,这种运动模式指的是一个物体、表面、边缘在一个视角下由一个观察者(比如眼睛、摄像头等)和背景之间形成的明显移动。光流技术,如运动检测和图像分割,时间碰撞,运动补偿编码,三维立体视差,都是利用了这种边缘或表面运动的技术。
二维图像的移动相对于观察者而言是三维物体移动的在图像平面的投影。
有序的图像可以估计出二维图像的瞬时图像速率或离散图像转移。
光流算法:
它评估了两幅图像的之间的变形,它的基本假设是体素和图像像素守恒。它假设一个物体的颜色在前后两帧没有巨大而明显的变化。基于这个思路,我们可以得到图像约束方程。不同的光流算法解决了假定了不同附加条件的光流问题。
Lucas–Kanade算法:
这个算法是最常见,最流行的。它计算两帧在时间t 到t + δt之间每个每个像素点位置的移动。 由于它是基于图像信号的泰勒级数,这种方法称为差分,这就是对于空间和时间坐标使用偏导数。
图像约束方程可以写为I (x ,y ,z ,t ) = I (x + δx ,y + δy ,z + δz ,t + δt )
I(x, y,z, t) 为在(x,y,z)位置的体素。
我们假设移动足够的小,那么对图像约束方程使用泰勒公式,我们可以得到:
H.O.T. 指更高阶,在移动足够小的情况下可以忽略。从这个方程中我们可以得到:
4.完整MATLAB
V