simpleseg.m
上传用户:liuping58
上传日期:2022-06-05
资源大小:105k
文件大小:4k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. function seg = simpleseg(I,init_mask,max_its,E,T)
  2. %-- Create a signed distance map (SDF) from mask
  3. phi = mask2phi(init_mask);
  4. %main loop
  5. for its = 1:max_its
  6.     
  7.     alpha=0.05;
  8.     D = E - abs(I - T);
  9.     K = get_curvature(phi);
  10.     F = -alpha*D + (1-alpha)*K;
  11.     
  12.     dxplus=shiftR(phi)-phi;
  13.     dyplus=shiftU(phi)-phi;
  14.     dzplus=shiftZ(phi)-phi;
  15.     dxminus=phi-shiftL(phi);
  16.     dyminus=phi-shiftD(phi);
  17.     dzminus=phi-shiftminusZ(phi);    
  18.     gradphimax_x = sqrt(max(dxplus,0).^2+max(-dxminus,0).^2);
  19.     gradphimin_x = sqrt(min(dxplus,0).^2+min(-dxminus,0).^2);
  20.     gradphimax_y = sqrt(max(dyplus,0).^2+max(-dyminus,0).^2);
  21.     gradphimin_y = sqrt(min(dyplus,0).^2+min(-dyminus,0).^2);
  22.     gradphimax_z = sqrt(max(dzplus,0).^2+max(-dzminus,0).^2);
  23.     gradphimin_z = sqrt(min(dzplus,0).^2+min(-dzminus,0).^2);    
  24.     
  25.     
  26.     gradphimax = sqrt((gradphimax_x.^2)+(gradphimax_y.^2)+(gradphimax_z.^2));
  27.     gradphimin = sqrt((gradphimin_x.^2)+(gradphimin_y.^2)+(gradphimin_z.^2));
  28.     
  29.     gradphi=(F>0).*(gradphimax) + (F<0).*(gradphimin);
  30.     
  31.     %stability CFL
  32.     %dt = .5/max(max(max(abs(F.*gradphi))));
  33.     dt=0.1;
  34.     
  35.     %evolve the curve
  36.     phi = phi + dt.*(F).*gradphi;
  37.     
  38.     %reinitialise distance funciton every 50 iterations
  39.     if(mod(its,50) == 0)
  40.         phi=bwdist(phi<0)-bwdist(phi>0);
  41.     end
  42.     
  43.     %intermediate output
  44.     if(mod(its,20) == 0)
  45.         showCurveAndPhi(I,phi,its);
  46.         %subplot(2,2,4); surf(phi)
  47.     end
  48. end
  49. %showCurveAndPhi(I,phi,its);
  50. %make mask from SDF
  51. seg = phi<=0; %-- Get mask from levelset
  52. %-- whole matrix derivatives
  53. function shift = shiftD(M)
  54. shift = [ M(1,:,:) ; M(1:size(M,1)-1,:,:)];
  55. function shift = shiftL(M)
  56. shift = [ M(:,2:size(M,2),:) M(:,size(M,2),:) ];
  57. function shift = shiftR(M)
  58. shift = [ M(:,1,:) M(:,1:size(M,2)-1,:) ];
  59. function shift = shiftU(M)
  60. shift = [ M(2:size(M,2),:,:) ; M(size(M,2),:,:) ];
  61. function shift = shiftZ(M)
  62. M(:,:,1)=M(:,:,1);
  63. M(:,:,2:end)=M(:,:,1:end-1);
  64. shift=M;
  65. function shift = shiftminusZ(M)
  66. M(:,:,end)=M(:,:,end);
  67. M(:,:,1:end-1)=M(:,:,2:end);
  68. shift=M;
  69. function curvature=get_curvature(phi)
  70. dx=(shiftR(phi)-shiftL(phi))/2;
  71. dy=(shiftU(phi)-shiftD(phi))/2;
  72. dz=(shiftZ(phi)-shiftminusZ(phi))/2;
  73. dxplus=shiftR(phi)-phi;
  74. dyplus=shiftU(phi)-phi;
  75. dzplus=shiftZ(phi)-phi;
  76. dxminus=phi-shiftL(phi);
  77. dyminus=phi-shiftD(phi);
  78. dzminus=phi-shiftminusZ(phi); 
  79. dxplusy =(shiftU(shiftR(phi))-shiftU(shiftL(phi)))/2;
  80. dxminusy=(shiftD(shiftR(phi))-shiftD(shiftL(phi)))/2;
  81. dxplusz =(shiftR(shiftZ(phi))-shiftL(shiftZ(phi)))/2;
  82. dxminusz=(shiftR(shiftminusZ(phi))-shiftL(shiftminusZ(phi)))/2;
  83. dyplusx =(shiftR(shiftU(phi))-shiftR(shiftD(phi)))/2;
  84. dyminusx=(shiftL(shiftU(phi))-shiftL(shiftD(phi)))/2;
  85. dyplusz =(shiftU(shiftZ(phi))-shiftD(shiftZ(phi)))/2;
  86. dyminusz=(shiftU(shiftminusZ(phi))-shiftD(shiftminusZ(phi)))/2;
  87. dzplusx =(shiftZ(shiftR(phi))-shiftminusZ(shiftR(phi)))/2;
  88. dzminusx=(shiftZ(shiftL(phi))-shiftminusZ(shiftL(phi)))/2;
  89. dzplusy =(shiftZ(shiftU(phi))-shiftminusZ(shiftU(phi)))/2;
  90. dzminusy=(shiftZ(shiftD(phi))-shiftminusZ(shiftD(phi)))/2;
  91. nplusx = dxplus./sqrt(eps+(dxplus.^2 )+((dyplusx+dy )/2).^2 + ((dzplusx+dz)/2).^2);
  92. nplusy = dyplus./sqrt(eps+(dyplus.^2 )+((dxplusy+dx )/2).^2 + ((dzplusy+dz)/2).^2);
  93. nplusz = dzplus./sqrt(eps+(dzplus.^2 )+((dxplusz+dx )/2).^2 + ((dyplusz+dy)/2).^2);
  94. nminusx= dxminus./sqrt(eps+(dxminus.^2)+((dyminusx+dy)/2).^2 + ((dzminusx+dz)/2).^2);
  95. nminusy= dyminus./sqrt(eps+(dyminus.^2)+((dxminusy+dx)/2).^2 + ((dzminusy+dz)/2).^2);
  96. nminusz= dzminus./sqrt(eps+(dzminus.^2)+((dxminusz+dx)/2).^2 + ((dyminusz+dy)/2).^2);
  97. curvature=((nplusx-nminusx)+(nplusy-nminusy)+(nplusz-nminusz))/2;
  98. %---------------------------------------------------------------------
  99. %-- AUXILIARY FUNCTIONS ----------------------------------------------
  100. %---------------------------------------------------------------------
  101. %-- Displays the image with curve superimposed
  102. function showCurveAndPhi(I, phi, i)
  103. figure(1);
  104. % subplot(2,2,3); title('Evolution'); view(3);
  105. % cla;
  106. % isosurface(phi<0);title([num2str(i) ' Iterations']); camlight; lighting gouraud; drawnow;
  107. figure(4);
  108. imagesc(I(:,:,10));
  109. hold on
  110. contour(phi(:,:,10),[0 0],'r');
  111. %-- converts a mask to a SDF
  112. function phi = mask2phi(init_a)
  113. phi=bwdist(init_a)-bwdist(1-init_a);