打字猴:1.7010103e+09
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
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所示。
[ 上一页 ]  [ :1.7010103e+09 ]  [ 下一页 ]