OSDN Git Service

Merge branch 'master' of git.osdn.jp:/gitroot/eos/base
[eos/base.git] / src / Tools / mrcImage / mrcImageFeatureCalc / src / mrcImageFeatureCalc.c
1 /*
2 # mrcImageFeatureCalc : $Revision$  
3 # $Date$ 
4 # Created by $Author$
5 # Usage : mrcImageFeatureCalc
6 # Attention
7 #   $Loccker$
8 #       $State$ 
9 #
10 */
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <math.h>                  
15 #define GLOBAL_DECLARATION
16 #include "../inc/config.h"
17
18 #define DEBUG
19 #include "genUtil.h"
20 #include "lmrcImageFeatureCalc.h"
21
22 /*
23 Example:
24 typedef struct lmrcImageFeatureCalcInfo {
25         float a;
26         int   b;
27 } lmrcImageFeatureCalcInfo;
28
29 typedef enum lmrcImageFeatureCalcMode {
30         a=0,
31         b=1
32 } lmrcImageFeatureCalcMode;
33 */
34
35 int
36 main(int argc, char* argv[]) 
37 {
38         mrcImageFeatureCalcInfo info;
39         lmrcImageFeatureList    linfo;
40         mrcImage in;
41         mrcImage out;
42         mrcImage label;
43   mrcImage density;
44   mrcImage densityWeightedArea;
45         lmrcImagePerimeterCalcInfo lperi;
46         mrcImage peri;
47         lmrcImageSurfaceAreaCalcInfo lsurface;
48         mrcImage surfaceArea;
49         int i;
50         double data;
51
52         init0(&info);
53     argCheck(&info, argc, argv);
54     init1(&info);
55
56         DEBUGPRINT("Program Start\n");
57
58         mrcFileRead(&in, info.In, "in main", 0);
59   if(info.flagInDensity) {
60           mrcFileRead(&density, info.InDensity, "in main", 0);
61   }
62
63         DEBUGPRINT("lmrcImageLabeling\n");
64         lmrcImageLabeling(&label, &in, info.neighbor, 1);
65         
66         DEBUGPRINT("lmrcImageBasicFeatureCalc\n");
67         linfo.flagNumber = 0;
68         lmrcImageBasicFeatureCalc(&out, &linfo, &label, info.mode);
69
70         if(info.flagOutPerimeter || info.flagOutChain) {
71                 if(in.HeaderN.z<=1) {
72                         lperi.flagArea=0;
73                         switch(info.neighbor) {
74                                 case 0:
75                                 case 4: {
76                                         lperi.Neighbor=4;
77                                         lmrcImagePerimeterCalc(&peri, &in, &lperi, 1);
78                                         break;
79                                 }
80                                 case 8: {
81                                         lperi.Neighbor=8;
82                                         lmrcImagePerimeterCalc(&peri, &in, &lperi, 0);
83                                         break;  
84                                 }
85                                 default: {
86                                         fprintf(stderr, "Not supported neighbor: %ld\n", info.neighbor);
87                                         fprintf(stderr, "Use 6-neighbor\n");
88                                         lmrcImagePerimeterCalc(&peri, &in, &lperi, 1);
89                                         break;
90                                 }
91                         }
92                         for(i=0; i<=linfo.Number; i++) {
93                                 mrcPixelDataGet(&peri, 
94                                         linfo.each[i].bottomLeft.x,
95                                         linfo.each[i].bottomLeft.y,
96                                         linfo.each[i].bottomLeft.z,
97                                         &linfo.each[i].perimeter,
98                                         mrcPixelRePart,
99                                         mrcPixelHowNearest);
100                                 linfo.each[i].flagPerimeter = 1;                        
101                         }
102       if(info.flagOutPerimeter) {
103                           mrcFileWrite(&peri, info.OutPerimeter, "in main", 0);
104       }
105       if(info.flagOutChain) {
106                           mrcFileWrite(lperi.ChainCode, info.OutChain, "in main", 0);
107       }
108                 } else {
109                         fprintf(stderr, "Not supported for 3D image\n");
110                 }
111         }
112
113         if(info.flagOutSurfaceArea) {
114                 if(1<in.HeaderN.z) {
115                         lsurface.Neighbor = info.neighbor; 
116                         if(lsurface.Neighbor==0) {
117                                 lsurface.Neighbor = 6;
118                         }
119                         lsurface.Mode = 0;
120                         lsurface.flagArea = 0;
121                         DEBUGPRINT("lmrcImageSurfaceAreaCalc Start\n");
122                         lmrcImageSurfaceAreaCalc(&surfaceArea, &in, &lsurface, 0); 
123                         DEBUGPRINT("lmrcImageSurfaceAreaCalc End\n");
124                         for(i=0; i<=linfo.Number; i++) {
125                                 mrcPixelDataGet(&surfaceArea, 
126                                         linfo.each[i].bottomLeft.x,
127                                         linfo.each[i].bottomLeft.y,
128                                         linfo.each[i].bottomLeft.z,
129                                         &linfo.each[i].surfaceArea,
130                                         mrcPixelRePart,
131                                         mrcPixelHowNearest);
132                                 linfo.each[i].flagSurfaceArea = 1;                      
133                         }
134                         mrcFileWrite(&surfaceArea, info.OutSurfaceArea, "in main", 0);
135                 } else {
136                         fprintf(stderr, "Not supported for 2D image\n");
137                 }
138
139         }
140         DEBUGPRINT("lmrcImageFeaturePrint\n");
141         lmrcImageFeaturePrint(info.fptOut, &linfo, info.mode);  
142         if(info.flagOutGC) {
143                 mrcFileWrite(&out, info.OutGC, "in main", 0);
144         }
145         if(info.flagOutLabel) {
146                 mrcFileWrite(&label, info.OutLabel, "in main", 0);
147         }
148   if(info.flagOutDensityWeightedArea) {
149                 mrcFileWrite(&densityWeightedArea, info.OutDensityWeightedArea, "in main", 0);
150   }
151         exit(EXIT_SUCCESS);
152 }
153
154 void
155 additionalUsage()
156 {
157         fprintf(stderr, "----- Additional Usage -----\n");
158         fprintf(stderr, "Mode\n");
159 }