This repository is a base of Eos.
Revisión | 10da2e95c5b15654dd70b8dafaf4f382ed1a92ae (tree) |
---|---|
Tiempo | 2015-11-14 14:04:52 |
Autor | Takuo Yasunaga <yasunaga@bio....> |
Commiter | Takuo Yasunaga |
mrcImageFeatureCalc: modified
modified: include/lmrcImageFeatureCalc.h
modified: src/Objects/DataManip/mrcImage/src/lmrcImageFeatureCalc.c
modified: src/Objects/DataManip/mrcImage/src/lmrcImageFeatureCalc.h
modified: src/Objects/DataManip/mrcImage/src/lmrcImageSurfaceAreaCalc.c
@@ -77,6 +77,14 @@ typedef struct lmrcImageFeatureEach { | ||
77 | 77 | int flagCircularity; |
78 | 78 | double circularity; |
79 | 79 | |
80 | + // Complexity | |
81 | + int flagComplexity; | |
82 | + double complexity; | |
83 | + | |
84 | + // Complexity | |
85 | + int flagDiameter; | |
86 | + double diameter; | |
87 | + | |
80 | 88 | // PCA |
81 | 89 | float lamda[3]; |
82 | 90 |
@@ -116,6 +124,8 @@ extern void lmrcImageSurfaceAreaCalcUsage(FILE* fpt); | ||
116 | 124 | |
117 | 125 | |
118 | 126 | extern void lmrcImageCircularityCalc(lmrcImageFeatureList* linfo, int mode); |
127 | +extern void lmrcImageComplexityCalc(lmrcImageFeatureList* linfo, int mode); | |
128 | +extern void lmrcImageDiameterCalc(lmrcImageFeatureList* linfo, int mode); | |
119 | 129 | |
120 | 130 | extern int lmrcImageChainCodeSearch(int* chain, mrcImageParaTypeRealCoord* next, double* dL, mrcImage* in, mrcImageParaTypeRealCoord ori, int chainCodeStart, int mode); |
121 | 131 |
@@ -35,6 +35,18 @@ lmrcImageFeaturePrint(FILE* fpt, lmrcImageFeatureList* linfo, int mode) | ||
35 | 35 | if(linfo->each[0].flagCircularity) { |
36 | 36 | fprintf(fpt, " %12s", "circularity"); |
37 | 37 | } |
38 | + if(!linfo->each[0].flagComplexity) { | |
39 | + lmrcImageComplexityCalc(linfo, 0); | |
40 | + } | |
41 | + if(linfo->each[0].flagComplexity) { | |
42 | + fprintf(fpt, " %12s", "complexity"); | |
43 | + } | |
44 | + if(!linfo->each[0].flagDiameter) { | |
45 | + lmrcImageDiameterCalc(linfo, 0); | |
46 | + } | |
47 | + if(linfo->each[0].flagDiameter) { | |
48 | + fprintf(fpt, " %12s", "diameter"); | |
49 | + } | |
38 | 50 | fprintf(fpt, "\n"); |
39 | 51 | for(i=0; i<=linfo->Number; i++) { |
40 | 52 | fprintf(fpt, "%06d %10.4f %10.4f %10.4f %12.4f %6d %6d %6d", |
@@ -55,6 +67,12 @@ lmrcImageFeaturePrint(FILE* fpt, lmrcImageFeatureList* linfo, int mode) | ||
55 | 67 | if(linfo->each[i].flagCircularity) { |
56 | 68 | fprintf(fpt, " %12.4f", linfo->each[i].circularity); |
57 | 69 | } |
70 | + if(linfo->each[i].flagComplexity) { | |
71 | + fprintf(fpt, " %12.4f", linfo->each[i].complexity); | |
72 | + } | |
73 | + if(linfo->each[i].flagDiameter) { | |
74 | + fprintf(fpt, " %12.4f", linfo->each[i].diameter); | |
75 | + } | |
58 | 76 | fprintf(fpt, "\n"); |
59 | 77 | } |
60 | 78 | } |
@@ -91,6 +109,68 @@ lmrcImageCircularityCalc(lmrcImageFeatureList* linfo, int mode) | ||
91 | 109 | } |
92 | 110 | |
93 | 111 | void |
112 | +lmrcImageComplexityCalc(lmrcImageFeatureList* linfo, int mode) | |
113 | +{ | |
114 | + int i; | |
115 | + | |
116 | + if(linfo->each[0].flagPerimeter) { | |
117 | + for(i=0; i<=linfo->Number; i++) { | |
118 | + if(0<linfo->each[i].perimeter) { | |
119 | + linfo->each[i].complexity=SQR(linfo->each[i].perimeter)/linfo->each[i].area; | |
120 | + } else { | |
121 | + linfo->each[i].complexity=1e4; | |
122 | + } | |
123 | + linfo->each[i].flagComplexity=1; | |
124 | + } | |
125 | + } else if(linfo->each[0].flagSurfaceArea) { | |
126 | + for(i=0; i<=linfo->Number; i++) { | |
127 | + if(0<linfo->each[i].surfaceArea) { | |
128 | + linfo->each[i].complexity=CUBIC(linfo->each[i].surfaceArea)/SQR(linfo->each[i].area); | |
129 | + } else { | |
130 | + linfo->each[i].complexity=1e4; | |
131 | + } | |
132 | + linfo->each[i].flagComplexity=1; | |
133 | + } | |
134 | + } else { | |
135 | + fprintf(stderr, "Cannot calculate complexity because of no perimeter/surfaceArea\n"); | |
136 | + for(i=0; i<=linfo->Number; i++) { | |
137 | + linfo->each[i].flagComplexity=0; | |
138 | + } | |
139 | + } | |
140 | +} | |
141 | + | |
142 | +void | |
143 | +lmrcImageDiameterCalc(lmrcImageFeatureList* linfo, int mode) | |
144 | +{ | |
145 | + int i; | |
146 | + | |
147 | + if(linfo->each[0].flagPerimeter) { | |
148 | + for(i=0; i<=linfo->Number; i++) { | |
149 | + if(0<linfo->each[i].perimeter) { | |
150 | + linfo->each[i].diameter=sqrt(linfo->each[i].area/M_PI); | |
151 | + } else { | |
152 | + linfo->each[i].diameter=1e4; | |
153 | + } | |
154 | + linfo->each[i].flagDiameter=1; | |
155 | + } | |
156 | + } else if(linfo->each[0].flagSurfaceArea) { | |
157 | + for(i=0; i<=linfo->Number; i++) { | |
158 | + if(0<linfo->each[i].surfaceArea) { | |
159 | + linfo->each[i].diameter=pow(linfo->each[i].area/(4./3.*M_PI), 1.0/3.0); | |
160 | + } else { | |
161 | + linfo->each[i].diameter=1e4; | |
162 | + } | |
163 | + linfo->each[i].flagDiameter=1; | |
164 | + } | |
165 | + } else { | |
166 | + fprintf(stderr, "Cannot calculate diameter because of no perimeter/surfaceArea\n"); | |
167 | + for(i=0; i<=linfo->Number; i++) { | |
168 | + linfo->each[i].flagDiameter=0; | |
169 | + } | |
170 | + } | |
171 | +} | |
172 | + | |
173 | +void | |
94 | 174 | lmrcImageBasicFeatureCalc(mrcImage* gc, lmrcImageFeatureList* linfo, mrcImage* label, int mode) |
95 | 175 | { |
96 | 176 | int x, y, z; |
@@ -229,7 +309,7 @@ lmrcImagePerimeterCalc(mrcImage* out, mrcImage* in, lmrcImagePerimeterCalcInfo* | ||
229 | 309 | linfo->flagArea = 1; |
230 | 310 | label = linfo->Label = memoryAllocate(sizeof(mrcImage), "in lmrcImagePerimeterCalc"); |
231 | 311 | area = linfo->Area = memoryAllocate(sizeof(mrcImage), "in lmrcImagePerimeterCalc"); |
232 | - lmrcImageCalcArea(area, label, in, 0); | |
312 | + lmrcImageCalcArea(area, label, in, linfo->Neighbor, 0); | |
233 | 313 | } |
234 | 314 | lmrcImageLabelingOrder(label, 1); |
235 | 315 |
@@ -77,6 +77,14 @@ typedef struct lmrcImageFeatureEach { | ||
77 | 77 | int flagCircularity; |
78 | 78 | double circularity; |
79 | 79 | |
80 | + // Complexity | |
81 | + int flagComplexity; | |
82 | + double complexity; | |
83 | + | |
84 | + // Complexity | |
85 | + int flagDiameter; | |
86 | + double diameter; | |
87 | + | |
80 | 88 | // PCA |
81 | 89 | float lamda[3]; |
82 | 90 |
@@ -116,6 +124,8 @@ extern void lmrcImageSurfaceAreaCalcUsage(FILE* fpt); | ||
116 | 124 | |
117 | 125 | |
118 | 126 | extern void lmrcImageCircularityCalc(lmrcImageFeatureList* linfo, int mode); |
127 | +extern void lmrcImageComplexityCalc(lmrcImageFeatureList* linfo, int mode); | |
128 | +extern void lmrcImageDiameterCalc(lmrcImageFeatureList* linfo, int mode); | |
119 | 129 | |
120 | 130 | extern int lmrcImageChainCodeSearch(int* chain, mrcImageParaTypeRealCoord* next, double* dL, mrcImage* in, mrcImageParaTypeRealCoord ori, int chainCodeStart, int mode); |
121 | 131 |
@@ -54,7 +54,7 @@ lmrcImageSurfaceAreaCalc(mrcImage* out, mrcImage* bin, lmrcImageSurfaceAreaCalcI | ||
54 | 54 | } else { |
55 | 55 | area = linfo->Area = memoryAllocate(sizeof(mrcImage), "in lmrcImageSurfaceAreaCalc"); |
56 | 56 | label = linfo->Label = memoryAllocate(sizeof(mrcImage), "in lmrcImageSurfaceAreaCalc"); |
57 | - lmrcImageCalcArea(area, label, bin, 0); | |
57 | + lmrcImageCalcArea(area, label, bin, linfo->Neighbor, 0); | |
58 | 58 | DEBUGPRINT("lmrcImageLabelingOrder Start\n"); |
59 | 59 | lmrcImageLabelingOrder(label, 0); |
60 | 60 | } |