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

3D图形编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <float.h>
  5. #include <cutil.h>
  6. #include <math.h>
  7. #define max(x,y)    ((x>y) ? x : y )
  8. #define min(x,y)    ((x<y) ? x : y )
  9. #define DT 0.15
  10. char *volumeFilename, *maskFilename;
  11. int ITERATIONS, THRESHOLD, EPSILON;
  12. float alpha;
  13. float *phi, *D, *contour;
  14. size_t size;
  15. unsigned char *input,*output;
  16. int imageW, imageH, imageD, N;
  17. int its=0;
  18. unsigned int Timer = 0;
  19. unsigned int IterationTimer = 0;
  20. int i,j,k;
  21. unsigned char* loadRawUchar(char *filename, size_t size){
  22. FILE *fp = fopen(filename, "rb");
  23.     if (!fp) {
  24.         fprintf(stderr, "Error opening file '%s'n", filename);
  25.         return 0;
  26.     }
  27. unsigned char *data = (unsigned char *) malloc(size);
  28. size_t read = fread(data, 1, size, fp);
  29. fclose(fp);
  30.     printf("Read '%s', %d bytesn", filename, read);
  31.     return data;
  32. }
  33. float *loadMask(char *filename, size_t size){
  34. FILE *fp = fopen(filename, "rb");
  35.     if (!fp) {
  36.         fprintf(stderr, "Error opening file '%s'n", filename);
  37.         return 0;
  38.     }
  39. float *data = (float *) malloc(size*sizeof(float));
  40. size_t read = fread(data, 1, size, fp);
  41. fclose(fp);
  42.     printf("Read '%s', %d bytesn", filename, read);
  43.     return data;
  44. }
  45. void *writeoutput(unsigned char *data, size_t size){
  46. char *outputFilename= "output.raw";
  47. FILE *fp = fopen(outputFilename, "w");
  48.     if (!fp) {
  49.         fprintf(stderr, "Error opening file '%s'n", outputFilename);
  50.         return 0;
  51.     }
  52. size_t write = fwrite(data, 1, size, fp);
  53. fclose(fp);
  54.     printf("Write '%s', %d bytesn", outputFilename, write);
  55.     return 0;
  56. }
  57. void update_phi(){
  58. float dx,dy,dz;
  59. float dxplus, dyplus, dzplus, dxminus, dyminus, dzminus;
  60. float dxplusy, dxminusy, dxplusz, dxminusz, dyplusx, dyminusx, dyplusz, dyminusz, dzplusx, dzminusx, dzplusy, dzminusy;
  61. float gradphimax, gradphimin, nplusx, nplusy, nplusz, nminusx, nminusy, nminusz, curvature;
  62. float F, gradphi;
  63. float *phi1;
  64. int ind, jOFF, kOFF;
  65. jOFF=imageW;
  66. kOFF=imageW*imageH;
  67. phi1=(float *)malloc(imageW*imageH*imageD*sizeof(float));
  68. for(i=0;i<N;i++){
  69. phi1[i]=phi[i];
  70. }
  71. for(i=0;i<imageW;i++){
  72. for(j=0;j<imageH;j++){
  73. for(k=0;k<imageD;k++){
  74. ind=i+j*imageW+k*imageW*imageH;
  75. if(i==0||i==imageW-1){dx=0;} else {dx=(phi1[ind+1]-phi1[ind-1])/2;}
  76. if(j==0||j==imageH-1){dy=0;} else {dy=(phi1[ind-imageW]-phi1[ind+imageW])/2;}
  77. if(k==0||k==imageD-1){dz=0;} else {dz=(phi1[ind+kOFF]-phi1[ind-kOFF])/2;}
  78. if(i==imageW-1){dxplus=0;} else {dxplus=(phi1[ind+1]-phi1[ind]);}
  79. if(j==0){dyplus=0;} else {dyplus=(phi1[ind-imageW]-phi1[ind]);}
  80. if(k==imageD-1){dzplus=0;} else {dzplus=(phi1[ind+kOFF]-phi1[ind]);}
  81. if(i==0){dxminus=0;} else {dxminus=(phi1[ind]-phi1[ind-1]);}
  82. if(j==imageH-1){dyminus=0;} else {dyminus=(phi1[ind]-phi1[ind+imageW]);}
  83. if(k==0){dzminus=0;} else {dzminus=(phi1[ind]-phi1[ind-kOFF]);}
  84. if(i==0||i==imageW-1||j==0){dxplusy=0;} else {dxplusy=(phi1[ind-imageW+1]-phi1[ind-imageW-1])/2;}
  85. if(i==0||i==imageW-1||j==imageH-1){dxminusy=0;} else {dxminusy=(phi1[ind+imageW+1]-phi1[ind+imageW-1])/2;}
  86. if(i==0||i==imageW-1||k==imageD-1) {dxplusz=0;} else {dxplusz=(phi1[ind+kOFF+1]-phi1[ind+kOFF-1])/2;}
  87. if(i==0||i==imageW-1||k==0) {dxminusz=0;} else {dxminusz=(phi1[ind-kOFF+1]-phi1[ind-kOFF-1])/2;}
  88. if(j==0||j==imageH-1||i==imageW-1){dyplusx=0;} else {dyplusx=(phi1[ind-imageW+1]-phi1[ind+imageW+1])/2;}
  89. if(j==0||j==imageH-1||i==0){dyminusx=0;} else {dyminusx=(phi1[ind-imageW-1]-phi1[ind+imageW-1])/2;}
  90. if(j==0||j==imageH-1||k==imageD-1) {dyplusz=0;} else {dyplusz=(phi1[ind+kOFF-jOFF]-phi1[ind+kOFF+jOFF])/2;}
  91. if(j==0||j==imageH-1||k==0) {dyminusz=0;} else {dyminusz=(phi1[ind-kOFF-jOFF]-phi1[ind-kOFF+jOFF])/2;}
  92. if(k==0||k==imageD-1||i==imageW-1) {dzplusx=0;} else {dzplusx=(phi1[ind+1+kOFF]-phi1[ind+1-kOFF])/2;}
  93. if(k==0||k==imageD-1||i==0) {dzminusx=0;} else {dzminusx=(phi1[ind-1+kOFF]-phi1[ind-1-kOFF])/2;}
  94. if(k==0||k==imageD-1||j==0) {dzplusy=0;} else {dzplusy=(phi1[ind-jOFF+kOFF]-phi1[ind-jOFF-kOFF])/2;}
  95. if(k==0||k==imageD-1||j==imageH-1) {dzminusy=0;} else {dzminusy=(phi1[ind+jOFF+kOFF]-phi1[ind+jOFF-kOFF])/2;}
  96. gradphimax=sqrt((sqrt(max(dxplus,0)*max(dxplus,0)+max(-dxminus,0)*max(-dxminus,0)))*(sqrt(max(dxplus,0)*max(dxplus,0)+max(-dxminus,0)*max(-dxminus,0)))
  97. +(sqrt(max(dyplus,0)*max(dyplus,0)+max(-dyminus,0)*max(-dyminus,0)))*(sqrt(max(dyplus,0)*max(dyplus,0)+max(-dyminus,0)*max(-dyminus,0)))
  98. +(sqrt(max(dzplus,0)*max(dzplus,0)+max(-dzminus,0)*max(-dzminus,0)))*(sqrt(max(dzplus,0)*max(dzplus,0)+max(-dzminus,0)*max(-dzminus,0))));
  99. gradphimin=sqrt((sqrt(min(dxplus,0)*min(dxplus,0)+min(-dxminus,0)*min(-dxminus,0)))*(sqrt(min(dxplus,0)*min(dxplus,0)+min(-dxminus,0)*min(-dxminus,0)))
  100. +(sqrt(min(dyplus,0)*min(dyplus,0)+min(-dyminus,0)*min(-dyminus,0)))*(sqrt(min(dyplus,0)*min(dyplus,0)+min(-dyminus,0)*min(-dyminus,0)))
  101. +(sqrt(min(dzplus,0)*min(dzplus,0)+min(-dzminus,0)*min(-dzminus,0)))*(sqrt(min(dzplus,0)*min(dzplus,0)+min(-dzminus,0)*min(-dzminus,0))));
  102. nplusx= dxplus / sqrt(1.192092896e-07F + (dxplus*dxplus) + ((dyplusx + dy)*(dyplusx + dy)*0.25) + ((dzplusx + dz)*(dzplusx + dz)*0.25));
  103. nplusy= dyplus / sqrt(1.192092896e-07F + (dyplus*dyplus) + ((dxplusy + dx)*(dxplusy + dx)*0.25) + ((dzplusy + dz)*(dzplusy + dz)*0.25));
  104. nplusz= dzplus / sqrt(1.192092896e-07F + (dzplus*dzplus) + ((dxplusz + dz)*(dxplusz + dz)*0.25) + ((dyplusz + dy)*(dyplusz + dy)*0.25));
  105. nminusx= dxminus / sqrt(1.192092896e-07F + (dxminus*dxminus) + ((dyminusx + dy)*(dyminusx + dy)*0.25) + ((dzminusx + dz)*(dzminusx + dz)*0.25));
  106. nminusy= dyminus / sqrt(1.192092896e-07F + (dyminus*dyminus) + ((dxminusy + dx)*(dxminusy + dx)*0.25) + ((dzminusy + dz)*(dzminusy + dz)*0.25));
  107. nminusz= dzminus / sqrt(1.192092896e-07F + (dzminus*dzminus) + ((dxminusz + dz)*(dxminusz + dz)*0.25) + ((dyminusz + dy)*(dyminusz + dy)*0.25));
  108. curvature= ((nplusx-nminusx)+(nplusy-nminusy)+(nplusz-nminusz))/2;
  109. F = (-alpha * D[ind]) + ((1-alpha) * curvature);
  110. if(F>0) {gradphi=gradphimax;} else {gradphi=gradphimin;}
  111. phi[ind]=phi1[ind] + (DT * F * gradphi);
  112. }
  113. }
  114. }
  115. free(phi1);
  116. }
  117. int main(int argc, char** argv){
  118. if(argc<9){
  119. printf("Too few command line arguments specified. Example: Seg -volume=brain_181_217_181.raw -mask=phi.raw -xsize=181 -ysize=217 -zsize=181 -iterations=1000 -threshold=150 -epsilon=50 -alpha=0.01n");
  120. exit(0);
  121. }
  122. cutGetCmdLineArgumentstr( argc, (const char**) argv, "volume", &volumeFilename);
  123. cutGetCmdLineArgumentstr( argc, (const char**) argv, "mask", &maskFilename);
  124. cutGetCmdLineArgumenti( argc, (const char**) argv, "xsize", &imageW);
  125. cutGetCmdLineArgumenti( argc, (const char**) argv, "ysize", &imageH);
  126. cutGetCmdLineArgumenti( argc, (const char**) argv, "zsize", &imageD);
  127. cutGetCmdLineArgumenti( argc, (const char**) argv, "iterations", &ITERATIONS);
  128. cutGetCmdLineArgumenti( argc, (const char**) argv, "threshold", &THRESHOLD);
  129. cutGetCmdLineArgumenti( argc, (const char**) argv, "epsilon", &EPSILON);
  130. cutGetCmdLineArgumentf( argc, (const char**) argv, "alpha", &alpha);
  131. N=imageW*imageH*imageD;
  132. input = loadRawUchar(volumeFilename, N);
  133. phi = loadMask(maskFilename, N);
  134. if((D = (float *)malloc(imageW*imageH*imageD*sizeof(float)))==NULL)printf("ME_Dn");
  135. for(i=0;i<N;i++){
  136. D[i] = EPSILON - abs(input[i] - THRESHOLD);
  137. }
  138. // Set up CUDA Timer
  139. cutCreateTimer(&Timer);
  140. cutCreateTimer(&IterationTimer);
  141. cutStartTimer(Timer);
  142. for(its=0;its<ITERATIONS;its++){
  143. update_phi();
  144. if(its%10==0)printf("Iteration %3d Total Time: %3.2f ReInit Time: %3.2fn", its, 0.001*cutGetTimerValue(Timer), 0.001*cutGetTimerValue(IterationTimer));
  145. }
  146. if((output = (unsigned char *) malloc(size))==NULL)printf("ME_OUTPUTn");
  147. for(i=0;i<N;i++){
  148. if(phi[i]>0){output[i]=0;} else { output[i]=255; }
  149. }
  150. writeoutput(output, size);
  151. }