1701010320
采用两点之间直线距离最短,进行两眼距离计算,MATLAB编程如下:
1701010321
1701010322
figure(‘color’,[1,1,1]) %设置图像背景为白色 imshow(background,[]) %显示图像 hold on %保持句柄 plot(48,64,‘r.’,‘Markersize’,20) %画图 plot(71,62,‘r.’,‘Markersize’,20) plot([48,71],[64,62],‘b-‘,‘linewidth’,3’) dmin = sqrt((48-71)^2+(64-62)^2); %距离计算 disp([‘左右眼的最短路径为:’, num2str(dmin)]) %显示距离计算值
1701010323
1701010324
运行程序结果如下:
1701010325
1701010326
左右眼的最短路径为:23.0868
1701010327
1701010328
输出图形如图9-7所示。
1701010329
1701010330
1701010331
1701010332
1701010333
图9-7 图像平面距离
1701010334
1701010335
从结果中可看出,两眼距离为23.0868(单位为本图像的像素单位),其两眼之间的距离为两点连线的直线距离。
1701010336
1701010337
【问题】直线距离计算是否合理?
1701010338
1701010339
【分析】
1701010340
1701010341
直线距离只是考虑了二维平面上的距离,然而实际人眼之间的距离,是由左眼起,通过鼻梁等逐渐过渡到右眼的,这个距离应该是满足空间位置关系的,因此用简单的直线距离来度量,未免显得不符合实际工况。在此采用3D空间进行两眼之间的距离度量,编程如下:
1701010342
1701010343
%%求解两眼基于灰度值的最小距离 clc,clear,close all %清屏和清除变量 warning off %消除警告 [X1,Y1]= meshgrid(1
:30,1:40); %x和y平面化 Z1 = background(1
:4:end,1:4:end); %z figure(‘color’,[1,1,1]) %设置图形背景为白色 mesh(X1,Y1,Z1) %画图 set(gca,‘Xdir’,‘reverse’); %设置x轴反向 set(gca,‘Ydir’,‘reverse’); %设置y轴反向 box on;grid off %显示图形盒子边框,消除网格化 sta = [20,16,105]; %起点 des = [13,16,72]; %终点 hold on %保持句柄 plot3(20,16,105,‘r.’,‘Markersize’,50) %画图 plot3(13,16,72,‘r.’,‘Markersize’,50) view([-39.5 70]); %设置图形视角 %% nX1 = size(X1); kk=1; for i=1
:nX1(1,1) for j=1
:nX1(1,2) X2(1,kk) = X1(i,j); %矩阵变为一行,化成单独一个一个对应的点 Y2(1,kk) = Y1(i,j); Z2(1,kk) = Z1(i,j); kk=kk+1; end end %% for i=1
:length(X2) for j=1
:length(X2) Distance(i,j)=sqrt( (X2(i)-X2(j))^2 + (Y2(i)-Y2(j))^2 + (Z2(i)-Z2(j))^2 ); Distance(j,i)=Distance(i,j); end end %%邻接矩阵 A=zeros(length(X2),length(X2)); %构建邻接矩阵 %第一行数据 for i = 1
:nX1(1,2)-1 A(i,i+1)=1; A(i,nX1(1,2)+i)=1; A(i,nX1(1,2)+i+1)=1; end for i=2
:nX1(1,1)-1 %第二行到倒数第二行 for j=2
:nX1(1,2)-1 %倒数第二列 A( (i-1)*nX1(1,2)+j, (i-2)*nX1(1,2)+j ) = 1; %该点正上方点 A( (i-1)*nX1(1,2)+j, (i-2)*nX1(1,2)+j-1 ) = 1; %该点正上方点,向左移一位 A( (i-1)*nX1(1,2)+j, (i-2)*nX1(1,2)+j+1 ) = 1; %该点正上方点,向右移一位 A( (i-1)*nX1(1,2)+j, (i-1)*nX1(1,2)+j-1 ) = 1; %该点行上,向左移一位 A( (i-1)*nX1(1,2)+j, (i-1)*nX1(1,2)+j+1 ) = 1; %该点行上,向右移一位 A( (i-1)*nX1(1,2)+j, (i)*nX1(1,2)+j ) = 1; %该点正下方点 A( (i-1)*nX1(1,2)+j, (i)*nX1(1,2)+j-1 ) = 1; %该点正下方点,向左移一位 A( (i-1)*nX1(1,2)+j, (i)*nX1(1,2)+j+1 ) = 1; %该点正下方点,向右移一位 end end for i=1
:length(X2) for j=1
:length(X2) A(j,i)=A(i,j); end end %%求最短路径 %左眼[20,16,105],右眼[13,16,72] D=Distance.*A; %相连节点计算距离 D(find(D==0))=99999; %两点无边相连时赋值为inf [Q_path, dmin] = dijkstra( 20*nX1(1,2)+16,13*nX1(1,2)+16 ,D); disp([‘左右眼的最短路径为:’, num2str(dmin)]) figure(‘color’,[1,1,1]), mesh(X1,Y1,Z1) %三维曲面 xlabel(‘X’);ylabel(‘Y’);zlabel(‘Z’) hold on plot3(20,16,105,‘r.’,‘Markersize’,50) plot3(13,16,72,‘r.’,‘Markersize’,50) for i=1
:length(Q_path) row = ( Q_path(i) - mod(Q_path(i), nX1(1,2)) )/nX1(1,2); column = mod(Q_path(i),nX1(1,2)); X3(i) = X1(column,row); Y3(i) = Y1(column,row); Z3(i) = Z1(column,row); plot3(X3(i),Y3(i),Z3(i),‘r.’,‘Markersize’,40,‘linewidth’,3); end plot3(X3,Y3,Z3,‘b-‘,‘Markersize’,40,‘linewidth’,3); set(gca,‘Xdir’,‘reverse’); set(gca,‘Ydir’,‘reverse’); view([-39.5 70]);
1701010344
1701010345
其中求3D空间两点之间最短路径的函数如下:
1701010346
1701010347
function [r_path, r_cost] = dijkstra(pathS, pathE, transmat) % pathS: 所求最短路径的起点 % pathE
:所求最短路径的终点 % transmat: 图的转移矩阵或者邻接矩阵,应为方阵 if ( size(transmat,1) ~= size(transmat,2) ) error( ‘detect_cycles
:Dijkstra_SC’, … ‘transmat has different width and heights’ ); end %初始化
: % noOfNode-图中的顶点数 % parent(i)-节点i的父节点 % distance(i)-从起点pathS的最短路径的长度 % queue-图的广度遍历 noOfNode = size(transmat, 1); for i = 1
:noOfNode parent(i) = 0; distance(i) = Inf; end queue = []; %从pathS: 所求最短路径的起点,开始寻找最短路径 for i=1
:noOfNode if transmat(pathS, i)~=Inf distance(i) = transmat(pathS, i); parent(i) = pathS; queue = [queue i]; end end %对图进行广度遍历 while length(queue) ~= 0 hopS = queue(1); queue = queue(2
:end); for hopE = 1
:noOfNode if distance(hopE) > distance(hopS) + transmat(hopS,hopE) distance(hopE) = distance(hopS) + transmat(hopS,hopE); parent(hopE) = hopS; queue = [queue hopE]; end end end %回溯进行最短路径的查找 r_path = [pathE]; i = parent(pathE); while i~=pathS && i~=0 r_path = [i r_path]; i = parent(i); end if i==pathS r_path = [i r_path]; else r_path = [] end %返回最短路径的权和 r_cost = distance(pathE);
1701010348
1701010349
运行程序输出图形如图9-8和图9-9所示。
1701010350
1701010351
1701010352
1701010353
图9-8 左右眼最短路径正视图 图9-9 左右眼最短路径3D图 两眼之间的距离在空间上的路径不是一条直线路径,而是一条曲线路径,反映到二维图像上,编程如下:
1701010354
1701010355
%close all figure(‘color’,[1,1,1]), %设置图形背景为白色 background = imresize(background,[160,130]); %改变图像大小 imshow(background,[]) %显示图像 xlabel(‘X’);ylabel(‘Y’);zlabel(‘Z’) %xyz坐标轴显示 hold on %图形保持句柄 plot(4*X3(1),4*Y3(1),‘r.’,‘Markersize’,30) %画图 plot(4*X3(end),4*Y3(end),‘r.’,‘Markersize’,30) plot(4*X3,4*Y3,‘b.’,‘Markersize’,10,‘linewidth’,3); plot(4*X3,4*Y3,‘b-‘,‘Markersize’,10,‘linewidth’,3); set(gca,‘Xdir’,‘reverse’); %设置x轴方向反向 set(gca,‘Ydir’,‘reverse’); %设置y轴方向反向 %view([-39.5 70]); %图形视角
1701010356
1701010357
运行程序结果如下:
1701010358
1701010359
左右眼的最短路径为: 43.0912
1701010360
1701010361
输出图形如图9-10所示。
1701010362
1701010363
1701010364
1701010365
1701010366
图9-10 左眼到右眼的最短路径
1701010367
1701010368
有结果可看出,两眼之间的最短距离为43.0912(单位为本图像的像素单位),如图9-10所示两眼之间的距离为其两点路径的距离。对比图9-7直线距离,图9-14为曲线连接。图9-14所示的两眼距离为43.0912,远远大于两眼直线距离23.0868,这是为什么呢?
1701010369
[
上一页 ]
[ :1.70101032e+09 ]
[
下一页 ]