Changeset 910 for trunk/src/uvmat.m


Ignore:
Timestamp:
Jun 13, 2015, 7:20:37 PM (9 years ago)
Author:
sommeria
Message:

bugs corrected in fix in civ_series. vectors set to 0 inside mask

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/uvmat.m

    r909 r910  
    14691469    flag=1;
    14701470    if ~isfield(UvData.Field,'A')
    1471             msgbox_uvmat('ERROR','an image needs to be opened to set the mask size');
    1472     return
     1471        msgbox_uvmat('ERROR','an image needs to be opened to set the mask size');
     1472        return
    14731473    end
    14741474    npx=size(UvData.Field.A,2);
     
    14771477    yi=0.5:npy-0.5;
    14781478    [Xi,Yi]=meshgrid(xi,yi);
    1479         for iobj=1:length(UvData.ProjObject)
    1480             ObjectData=UvData.ProjObject{iobj};
    1481             if isfield(ObjectData,'ProjMode') &&(isequal(ObjectData.ProjMode,'mask_inside')||isequal(ObjectData.ProjMode,'mask_outside'));
    1482                 flagobj=1;
    1483                 testphys=0; %coordinates in pixels by default
    1484                 if isfield(ObjectData,'CoordUnit') && ~isequal(ObjectData.CoordUnit,'pixel')
    1485                     if isfield(UvData,'XmlData')&& isfield(UvData.XmlData{1},'GeometryCalib')
    1486                         Calib=UvData.XmlData{1}.GeometryCalib;
    1487                         testphys=1;
     1479    for iobj=1:length(UvData.ProjObject)
     1480        ObjectData=UvData.ProjObject{iobj};
     1481        if isfield(ObjectData,'ProjMode') &&(isequal(ObjectData.ProjMode,'mask_inside')||isequal(ObjectData.ProjMode,'mask_outside'));
     1482            flagobj=1;
     1483            testphys=0; %coordinates in pixels by default
     1484            if isfield(ObjectData,'CoordUnit') && ~isequal(ObjectData.CoordUnit,'pixel')
     1485                if isfield(UvData,'XmlData')&& isfield(UvData.XmlData{1},'GeometryCalib')
     1486                    Calib=UvData.XmlData{1}.GeometryCalib;
     1487                    testphys=1;
     1488                end
     1489            end
     1490            if isfield(ObjectData,'Coord')&& isfield(ObjectData,'Type')
     1491                if isequal(ObjectData.Type,'polygon')
     1492                    X=ObjectData.Coord(:,1);
     1493                    Y=ObjectData.Coord(:,2);
     1494                    if testphys
     1495                        pos=[X Y zeros(size(X))];
     1496                        if isfield(Calib,'SliceCoord') && length(Calib.SliceCoord)>=3
     1497                            if isfield(Calib,'SliceAngle')&&~isequal(Calib.SliceAngle,[0 0 0])
     1498                                om=norm(Calib.SliceAngle);%norm of rotation angle in radians
     1499                                OmAxis=Calib.SliceAngle/om; %unit vector marking the rotation axis
     1500                                cos_om=cos(pi*om/180);
     1501                                sin_om=sin(pi*om/180);
     1502                                pos=cos_om*pos+sin_om*cross(OmAxis,pos)+(1-cos_om)*(OmAxis*pos')*OmAxis;
     1503                            end
     1504                            pos(:,1)=pos(:,1)+Calib.SliceCoord(1);
     1505                            pos(:,2)=pos(:,2)+Calib.SliceCoord(2);
     1506                            pos(:,3)=pos(:,3)+Calib.SliceCoord(3);
     1507                        end
     1508                        [X,Y]=px_XYZ(Calib,pos(:,1),pos(:,2),pos(:,3));
    14881509                    end
     1510                    flagobj=~inpolygon(Xi,Yi,X',Y');%=0 inside the polygon, 1 outside
     1511                elseif isequal(ObjectData.Type,'ellipse')
     1512                    if testphys
     1513                        %[X,Y]=px_XYZ(Calib,X,Y,0);% TODO:create a polygon boundary and transform to phys
     1514                    end
     1515                    RangeX=max(ObjectData.RangeX);
     1516                    RangeY=max(ObjectData.RangeY);
     1517                    X2Max=RangeX*RangeX;
     1518                    Y2Max=RangeY*RangeY;
     1519                    distX=(Xi-ObjectData.Coord(1,1));
     1520                    distY=(Yi-ObjectData.Coord(1,2));
     1521                    flagobj=(distX.*distX/X2Max+distY.*distY/Y2Max)>1;
     1522                elseif isequal(ObjectData.Type,'rectangle')
     1523                    if testphys
     1524                        %[X,Y]=px_XYZ(Calib,X,Y,0);% TODO:create a polygon boundary and transform to phys
     1525                    end
     1526                    distX=abs(Xi-ObjectData.Coord(1,1));
     1527                    distY=abs(Yi-ObjectData.Coord(1,2));
     1528                    flagobj=distX>max(ObjectData.RangeX) | distY>max(ObjectData.RangeY);
    14891529                end
    1490                 if isfield(ObjectData,'Coord')&& isfield(ObjectData,'Type')
    1491                     if isequal(ObjectData.Type,'polygon')
    1492                         X=ObjectData.Coord(:,1);
    1493                         Y=ObjectData.Coord(:,2);
    1494                         if testphys
    1495                             pos=[X Y zeros(size(X))];
    1496                             if isfield(Calib,'SliceCoord') && length(Calib.SliceCoord)>=3
    1497                                 if isfield(Calib,'SliceAngle')&&~isequal(Calib.SliceAngle,[0 0 0])
    1498                                     om=norm(Calib.SliceAngle);%norm of rotation angle in radians
    1499                                     OmAxis=Calib.SliceAngle/om; %unit vector marking the rotation axis
    1500                                     cos_om=cos(pi*om/180);
    1501                                     sin_om=sin(pi*om/180);
    1502                                     pos=cos_om*pos+sin_om*cross(OmAxis,pos)+(1-cos_om)*(OmAxis*pos')*OmAxis;
    1503                                 end
    1504                                 pos(:,1)=pos(:,1)+Calib.SliceCoord(1);
    1505                                 pos(:,2)=pos(:,2)+Calib.SliceCoord(2);
    1506                                 pos(:,3)=pos(:,3)+Calib.SliceCoord(3);
    1507                             end                           
    1508                             [X,Y]=px_XYZ(Calib,pos(:,1),pos(:,2),pos(:,3));
    1509                         end
    1510                         flagobj=~inpolygon(Xi,Yi,X',Y');%=0 inside the polygon, 1 outside
    1511                     elseif isequal(ObjectData.Type,'ellipse')
    1512                         if testphys
    1513                             %[X,Y]=px_XYZ(Calib,X,Y,0);% TODO:create a polygon boundary and transform to phys
    1514                         end
    1515                         RangeX=max(ObjectData.RangeX);
    1516                         RangeY=max(ObjectData.RangeY);
    1517                         X2Max=RangeX*RangeX;
    1518                         Y2Max=RangeY*RangeY;
    1519                         distX=(Xi-ObjectData.Coord(1,1));
    1520                         distY=(Yi-ObjectData.Coord(1,2));
    1521                         flagobj=(distX.*distX/X2Max+distY.*distY/Y2Max)>1;
    1522                     elseif isequal(ObjectData.Type,'rectangle')
    1523                         if testphys
    1524                             %[X,Y]=px_XYZ(Calib,X,Y,0);% TODO:create a polygon boundary and transform to phys
    1525                         end
    1526                         distX=abs(Xi-ObjectData.Coord(1,1));
    1527                         distY=abs(Yi-ObjectData.Coord(1,2));
    1528                         flagobj=distX>max(ObjectData.RangeX) | distY>max(ObjectData.RangeY);
    1529                     end
    1530                     if isequal(ObjectData.ProjMode,'mask_outside')
    1531                         flagobj=~flagobj;
    1532                     end
    1533                     flag=flag & flagobj;
     1530                if isequal(ObjectData.ProjMode,'mask_outside')
     1531                    flagobj=~flagobj;
    15341532                end
    1535             end
    1536         end
     1533                flag=flag & flagobj;
     1534            end
     1535        end
     1536    end
    15371537    %mask name
    15381538    RootPath=get(handles.RootPath,'String');
     
    15481548    imflag=uint8(255*(0.392+0.608*flag));% =100 for flag=0 (vectors not computed when 20<imflag<200)
    15491549    imflag=flipdim(imflag,1);
    1550 
     1550   
    15511551    %display the mask
    15521552    hfigmask=figure;
     
    15701570            end
    15711571        end
    1572         imwrite(imflag,answer,'BitDepth',8);
     1572        try
     1573            imwrite(imflag,answer,'BitDepth',8);
     1574        catch ME
     1575            msgbox_uvmat('ERROR',ME.message)
     1576        end
    15731577    end
    15741578    set(handles.ListObject,'Value',1)
Note: See TracChangeset for help on using the changeset viewer.