OSDN Git Service

mrcImageFeatureCalc: modified v2.3.28p0205
authorTakuo Yasunaga <yasunaga@bio.kyutech.ac.jp>
Sat, 14 Nov 2015 05:04:52 +0000 (14:04 +0900)
committerTakuo Yasunaga <yasunaga@bio.kyutech.ac.jp>
Sat, 14 Nov 2015 05:04:52 +0000 (14:04 +0900)
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

include/lmrcImageFeatureCalc.h
src/Objects/DataManip/mrcImage/src/lmrcImageFeatureCalc.c
src/Objects/DataManip/mrcImage/src/lmrcImageFeatureCalc.h
src/Objects/DataManip/mrcImage/src/lmrcImageSurfaceAreaCalc.c

index bd2839f..980644f 100644 (file)
@@ -77,6 +77,14 @@ typedef struct lmrcImageFeatureEach {
        int flagCircularity;
        double circularity;
 
+       // Complexity 
+       int flagComplexity;
+       double complexity;
+
+       // Complexity 
+       int flagDiameter;
+       double diameter;
+       
        // PCA
        float lamda[3];
 
@@ -116,6 +124,8 @@ extern void lmrcImageSurfaceAreaCalcUsage(FILE* fpt);
 
 
 extern void lmrcImageCircularityCalc(lmrcImageFeatureList* linfo, int mode);
+extern void lmrcImageComplexityCalc(lmrcImageFeatureList* linfo, int mode);
+extern void lmrcImageDiameterCalc(lmrcImageFeatureList* linfo, int mode);
 
 extern int lmrcImageChainCodeSearch(int* chain, mrcImageParaTypeRealCoord* next, double* dL, mrcImage* in, mrcImageParaTypeRealCoord ori, int chainCodeStart, int mode);
 
index 5b80115..3df32c7 100644 (file)
@@ -35,6 +35,18 @@ lmrcImageFeaturePrint(FILE* fpt, lmrcImageFeatureList* linfo, int mode)
        if(linfo->each[0].flagCircularity) {
                fprintf(fpt, " %12s", "circularity");
        }
+       if(!linfo->each[0].flagComplexity) {
+               lmrcImageComplexityCalc(linfo, 0);
+       }
+       if(linfo->each[0].flagComplexity) {
+               fprintf(fpt, " %12s", "complexity");
+       }
+       if(!linfo->each[0].flagDiameter) {
+               lmrcImageDiameterCalc(linfo, 0);
+       }
+       if(linfo->each[0].flagDiameter) {
+               fprintf(fpt, " %12s", "diameter");
+       }
        fprintf(fpt, "\n");
        for(i=0; i<=linfo->Number; i++) {
                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)
                if(linfo->each[i].flagCircularity) {
                        fprintf(fpt, " %12.4f", linfo->each[i].circularity);
                }
+               if(linfo->each[i].flagComplexity) {
+                       fprintf(fpt, " %12.4f", linfo->each[i].complexity);
+               }
+               if(linfo->each[i].flagDiameter) {
+                       fprintf(fpt, " %12.4f", linfo->each[i].diameter);
+               }
                fprintf(fpt, "\n");
        }
 }
@@ -91,6 +109,68 @@ lmrcImageCircularityCalc(lmrcImageFeatureList* linfo, int mode)
 }
 
 void
+lmrcImageComplexityCalc(lmrcImageFeatureList* linfo, int mode)
+{
+       int i;
+
+       if(linfo->each[0].flagPerimeter) {
+               for(i=0; i<=linfo->Number; i++) {
+                       if(0<linfo->each[i].perimeter) {
+                               linfo->each[i].complexity=SQR(linfo->each[i].perimeter)/linfo->each[i].area;
+                       } else {
+                               linfo->each[i].complexity=1e4;
+                       }
+                       linfo->each[i].flagComplexity=1;
+               }
+       } else if(linfo->each[0].flagSurfaceArea) {
+               for(i=0; i<=linfo->Number; i++) {
+                       if(0<linfo->each[i].surfaceArea) {
+                               linfo->each[i].complexity=CUBIC(linfo->each[i].surfaceArea)/SQR(linfo->each[i].area);
+                       } else {
+                               linfo->each[i].complexity=1e4;
+                       }
+                       linfo->each[i].flagComplexity=1;
+               }
+       } else {
+               fprintf(stderr, "Cannot calculate complexity because of no perimeter/surfaceArea\n");
+               for(i=0; i<=linfo->Number; i++) {
+                       linfo->each[i].flagComplexity=0;
+               }
+       }
+}
+
+void
+lmrcImageDiameterCalc(lmrcImageFeatureList* linfo, int mode)
+{
+       int i;
+
+       if(linfo->each[0].flagPerimeter) {
+               for(i=0; i<=linfo->Number; i++) {
+                       if(0<linfo->each[i].perimeter) {
+                               linfo->each[i].diameter=sqrt(linfo->each[i].area/M_PI);
+                       } else {
+                               linfo->each[i].diameter=1e4;
+                       }
+                       linfo->each[i].flagDiameter=1;
+               }
+       } else if(linfo->each[0].flagSurfaceArea) {
+               for(i=0; i<=linfo->Number; i++) {
+                       if(0<linfo->each[i].surfaceArea) {
+                               linfo->each[i].diameter=pow(linfo->each[i].area/(4./3.*M_PI), 1.0/3.0);
+                       } else {
+                               linfo->each[i].diameter=1e4;
+                       }
+                       linfo->each[i].flagDiameter=1;
+               }
+       } else {
+               fprintf(stderr, "Cannot calculate diameter because of no perimeter/surfaceArea\n");
+               for(i=0; i<=linfo->Number; i++) {
+                       linfo->each[i].flagDiameter=0;
+               }
+       }
+}
+
+void
 lmrcImageBasicFeatureCalc(mrcImage* gc, lmrcImageFeatureList* linfo, mrcImage* label, int mode)
 {
        int x, y, z;
@@ -229,7 +309,7 @@ lmrcImagePerimeterCalc(mrcImage* out, mrcImage* in, lmrcImagePerimeterCalcInfo*
                linfo->flagArea = 1;
                label = linfo->Label = memoryAllocate(sizeof(mrcImage), "in lmrcImagePerimeterCalc");
                area  = linfo->Area  = memoryAllocate(sizeof(mrcImage), "in lmrcImagePerimeterCalc");
-               lmrcImageCalcArea(area, label, in, 0);
+               lmrcImageCalcArea(area, label, in, linfo->Neighbor, 0);
        }
        lmrcImageLabelingOrder(label, 1);
 
index bd2839f..980644f 100644 (file)
@@ -77,6 +77,14 @@ typedef struct lmrcImageFeatureEach {
        int flagCircularity;
        double circularity;
 
+       // Complexity 
+       int flagComplexity;
+       double complexity;
+
+       // Complexity 
+       int flagDiameter;
+       double diameter;
+       
        // PCA
        float lamda[3];
 
@@ -116,6 +124,8 @@ extern void lmrcImageSurfaceAreaCalcUsage(FILE* fpt);
 
 
 extern void lmrcImageCircularityCalc(lmrcImageFeatureList* linfo, int mode);
+extern void lmrcImageComplexityCalc(lmrcImageFeatureList* linfo, int mode);
+extern void lmrcImageDiameterCalc(lmrcImageFeatureList* linfo, int mode);
 
 extern int lmrcImageChainCodeSearch(int* chain, mrcImageParaTypeRealCoord* next, double* dL, mrcImage* in, mrcImageParaTypeRealCoord ori, int chainCodeStart, int mode);
 
index d619d16..fa1dead 100644 (file)
@@ -54,7 +54,7 @@ lmrcImageSurfaceAreaCalc(mrcImage* out, mrcImage* bin, lmrcImageSurfaceAreaCalcI
        } else {
                area  = linfo->Area  = memoryAllocate(sizeof(mrcImage), "in lmrcImageSurfaceAreaCalc"); 
                label = linfo->Label = memoryAllocate(sizeof(mrcImage), "in lmrcImageSurfaceAreaCalc"); 
-               lmrcImageCalcArea(area, label, bin, 0);
+               lmrcImageCalcArea(area, label, bin, linfo->Neighbor, 0);
                DEBUGPRINT("lmrcImageLabelingOrder Start\n");
                lmrcImageLabelingOrder(label, 0);
        }