打字猴:1.701010295e+09
1701010295
1701010296 两眼最短距离,能不能直接使用两点之间距离最短来度量呢?两眼之间的直线距离,这也是我们常用的距离,然而采用直线距离计算是否合理呢?
1701010297
1701010298 对于一幅图像本身,一幅灰度图像就是二维平面的灰度值集合,本设计中采用左眼点[48,64],右眼点[71,62],进行图像标记,如图9-5所示,左右眼标记程序设计如下:
1701010299
1701010300     %%左眼[48,64],右眼[71,62]    figure(‘color’,[1,1,1])                   %设置图像背景为白色    imshow(background,[])                     %显示图像    hold on                                   %保持句柄    plot(48,64,‘r.’,‘Markersize’,20)          %画图    plot(71,62,‘r.’,‘Markersize’,20)          %画图
1701010301
1701010302
1701010303
1701010304
1701010305 图9-5 二维图像左右眼标记
1701010306
1701010307 反应到3D曲面上,进行左右眼标记,采用左眼点[20,16,105],右眼点[13,16,72],进行三维曲面标记,MATLAB程序如下:
1701010308
1701010309     %%surf,左眼[20,16,105],右眼[13,16,72]    figure(‘color’,[1,1,1])                    %设置图像背景为白色    mesh(background(1:4:end,1:4:end))          %绘制曲面图    zlim([0 256]);                             %z设置    hold on                                    %保持句柄    plot3(20,16,105,‘r.’,‘Markersize’,50)      %画图    plot3(13,16,72,‘g.’,‘Markersize’,50)    set(gca,‘Xdir’,‘reverse’);                 %设置x轴反向    set(gca,‘Ydir’,‘reverse’);                 %设置y轴反向    box on;grid off                            %显示图形盒子边框,消除网格化
1701010310
1701010311 运行程序输出图形如图9-6所示。
1701010312
1701010313
1701010314
1701010315
1701010316 图9-6 3D曲面左右眼标记
1701010317
1701010318 如图9-5和图9-6所示的图像中两眼位置,计算两眼之间的距离,那么两眼之间的距离究竟有多远?
1701010319
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
[ 上一页 ]  [ :1.701010295e+09 ]  [ 下一页 ]