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",
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");
}
}
}
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;
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);