예제 #1
0
/*
 * Read a plane out of an ICS file. The buffer is malloc'd, xsize and ysize
 * are set to the image size. The data type is always uint8. You need to free()
 * the data block when you're done.
 */
Ics_Error IcsLoadPreview (char const* filename, size_t planenumber, void** dest,
                          size_t* xsize, size_t* ysize)
{
   ICSDECL;
   ICS* ics;
   size_t bufsize;
   size_t xs, ys;
   void* buf;

   ICSXR( IcsOpen (&ics, filename, "r") );
   xs = ics->Dim[0].Size;
   ys = ics->Dim[1].Size;
   bufsize = xs*ys;
   buf = malloc(bufsize);
   ICSTR( buf == NULL, IcsErr_Alloc );
   error = IcsGetPreviewData (ics, buf, bufsize, planenumber);
   ICSXA( IcsClose(ics) );

   if (error == IcsErr_Ok) {
      *dest = buf;
      *xsize = xs;
      *ysize = ys;
   }
   else {
      free (buf);
   }
   return error;
}
예제 #2
0
파일: extract.c 프로젝트: anj1/cdac
int main(int argc, char **argv)
{

    Ics_Error icserr;
    ICS* ics;
    size_t dims[ICS_MAXDIM];
    int ndims;
    int i,j;
    Ics_DataType dt;
	char fname[32];
	char cmdlin[256];
    /* TODO */
    pix_type *prev;    /* previous frame */
	unsigned char *buf; /* 8-bit buffer */
	int startframe,endframe;
	int emin,emax;
	
    if(argc < 2){
        printf("usage: extract <filename>.ics [startframe [endframe]] [-e cutoff]\n");
        printf("the -e option enhances the contrast using histogram analysis.\n");
        printf("TODO: enabled by default, cutoff=16\n");
        printf("example: extract livecell.ics 30 35 e\n");
        printf("extracts all frames if start frame not specified\n");
        return 0;
    }
	
    /* Open file */
    icserr = IcsOpen(&ics, argv[1], "r");
    ICS_CHECK(icserr);

#ifdef DEBUG_PRINT
    printf("ics file loaded.\n");
#endif

    /* Sniff out file; make sure it is compatible with our prog */
    icserr = IcsGetLayout(ics, &dt, &ndims, dims);
    ICS_CHECK(icserr);
    if(dt != Ics_uint16){
        printf("Sorry, image modes other than 16-bit (unsigned) ");
        printf("not supported at the moment.\n");
        return 0;
    }
    
	/* number of frames specified */
	startframe = 0;
	endframe = dims[3];
	if(argc >= 3){
		startframe = strtol(argv[2],NULL,0);
		if(startframe > dims[3]) startframe = dims[3];
		if(startframe < 0){
			printf("Start frame number must be non-negative.\n");
			return 1;
		}
		if(argc >= 4){
			endframe = strtol(argv[3],NULL,0);
			if(endframe < startframe){
				printf("End frame number must be greater than start.\n");
				return 2;
			}
			if(endframe > dims[3]) endframe = dims[3];
		}
	}
	
#ifdef DEBUG_PRINT
    printf("dimensions: ");
    for(i=0;i<ndims;i++)
        printf("%ld ", dims[i]);
    printf("data type: %d \n", dt);
#endif

    /* TODO: warning if dimensions look non-standard */
   
    /* allocate space before reading */
    /* Only allocate for one frame; allows images with many frames
     * to be loaded without much memory, unlike some programs
     * (I'm looking at you, ics_opener/ImageJ ! */
    prev = malloc(dims[1]*dims[2]*sizeof(pix_type));
    buf = malloc(dims[1]*dims[2]*sizeof(unsigned char));
    if((!prev)||(!buf))
    {
        printf("Couldn't allocate enough memory.\n");
        return 1;
    }
   
	printf("tracking...\n");
	
    /* read sequentially from file. */
    /* Each call to IcsGetDataBlock proceeds from the end of the last */
    for(i=0;i<endframe;i++){
        icserr = IcsGetDataBlock(ics, prev, dims[1]*dims[2]*2);
        ICS_CHECK(icserr);
			
        if(i>=startframe){
			printf("frame %d\n", i);
			
			//for(j=0;j<dims[1]*dims[2];j++)
				//buf[j] = prev[j]; >> 4;
			
			/* normalize all images to first output frame */
			if(i==startframe) edr(prev, dims[1], dims[2], &emin, &emax);
			
			normalize(prev, buf, dims[1], dims[2], emin, emax);
			
			sprintf(fname, "frame_%04d.png", i);
			
			export_8bit_pgm(buf, dims[1], dims[2], "tmp.pgm");
			
			//alib_savebitmap(fname, buf, dims[1], dims[2], 8, 1);

			sprintf(cmdlin, "pnmtopng -compression 1 < tmp.pgm > %s", fname, fname);
			system(cmdlin);
		}
    }

    /* no need to free memory; that's just silly */
   
    IcsClose(ics);
    return 0;
}
예제 #3
0
파일: nucfollow.c 프로젝트: anj1/cdac
int main(int argc, char **argv)
{

    Ics_Error icserr;
    ICS* ics;
    size_t dims[ICS_MAXDIM];
    int ndims;
    int i,j;
    Ics_DataType dt;
    /* TODO */
    pix_type *prev;    /* previous frame */
	unsigned char *buf; /* 8-bit buffer */
	int startframe,endframe;
	int *tmp1,*tmp2,*var,*sob;
	int xmark[2],ymark[2];
	unsigned char *wsh;
	FILE *comf;
	char fname[64],cmdlin[128];
	
    if(argc < 4){
        printf("usage: nucfollow <filename>.ics <x> <y> [startframe [endframe]] [-e cutoff]\n");
        printf("(x,y) is the coordinate of the nucleus at first iteration.\n");
        printf("example: nucfollow livecell.ics 400 300 30\n");
        printf("extracts all frames if start frame not specified\n");
        return 0;
    }
	
    /* Open file */
    icserr = IcsOpen(&ics, argv[1], "r");
    ICS_CHECK(icserr);

#ifdef DEBUG_PRINT
    printf("ics file loaded.\n");
#endif

    /* Sniff out file; make sure it is compatible with our prog */
    icserr = IcsGetLayout(ics, &dt, &ndims, dims);
    ICS_CHECK(icserr);
    if(dt != Ics_uint16){
        printf("Sorry, image modes other than 16-bit (unsigned) ");
        printf("not supported at the moment.\n");
        return 0;
    }
    
    /* marker */
    xmark[0] = 10;
    ymark[0] = 10;
    xmark[1] = strtol(argv[2],NULL,0);
    ymark[1] = strtol(argv[3],NULL,0);
    
	/* number of frames specified */
	startframe = 0;
	endframe = 1;
	if(argc >= 5){
		startframe = strtol(argv[4],NULL,0);
		if(startframe > dims[3]) startframe = dims[3];
		if(startframe < 0){
			printf("Start frame number must be non-negative.\n");
			return 1;
		}
		if(argc >= 6){
			endframe = strtol(argv[5],NULL,0);
			if(endframe < startframe){
				printf("End frame number must be greater than start.\n");
				return 2;
			}
			if(endframe > dims[3]) endframe = dims[3];
		} else {
			endframe = startframe+1;
		}
	}
	
#ifdef DEBUG_PRINT
    printf("dimensions: ");
    for(i=0;i<ndims;i++)
        printf("%ld ", dims[i]);
    printf("data type: %d \n", dt);
#endif

    /* TODO: warning if dimensions look non-standard */
   
    /* allocate space before reading */
    /* Only allocate for one frame; allows images with many frames
     * to be loaded without much memory, unlike some programs
     * (I'm looking at you, ics_opener/ImageJ ! */
    prev = malloc(dims[1]*dims[2]*sizeof(pix_type));
    buf = malloc(dims[1]*dims[2]*sizeof(unsigned char));
    tmp1 = (int *)malloc(dims[1]*dims[2]*sizeof(int));
    tmp2 = (int *)malloc(dims[1]*dims[2]*sizeof(int));
    var  = (int *)malloc(dims[1]*dims[2]*sizeof(int));
    sob  = (int *)malloc(dims[1]*dims[2]*sizeof(int));
    wsh  = (unsigned char*)malloc(dims[1]*dims[2]*sizeof(int));
    if((!prev)||(!buf)||(!tmp1)||(!tmp2)||(!var)||(!sob)||(!wsh))
    {
        printf("Couldn't allocate enough memory.\n");
        return 1;
    }
   
    /* open CoM file for output */
    comf = fopen("comf.txt","w");
    if(!comf){
		printf("error: couldn't open comf.txt to write center of mass data!\n");
		return 22;
	}
	fprintf(comf,"frame x y\n");	/* legend */
	
	printf("tracking...\n");
	
    /* read sequentially from file. */
    /* Each call to IcsGetDataBlock proceeds from the end of the last */
    for(i=0;i<endframe;i++){
        icserr = IcsGetDataBlock(ics, prev, dims[1]*dims[2]*2);
        ICS_CHECK(icserr);
		
		if(i <startframe) continue;
		
		/* we are at the desired frame sequence. */
		
		/* variance filter */
		printf("frame %d\n", i);
		
		printf(" Variance filter...\n");
#if 0
		if(variance(prev,var,tmp1,tmp2,dims[1],dims[2],1.0,4.0,12))
			printf("Variance filter error!\n");
#endif
		fast_variance(prev, var, tmp1, dims[1], dims[2]);
		
		printf(" Cusp blur...\n");
		blur_cusp(var,tmp1,dims[1],dims[2],230);
		/*printf("Diffusion blur...\n");
		blur_diffuse(var,tmp2,dims[1],dims[2]);
		blur_diffuse(tmp2,var,dims[1],dims[2]);
		*/
		int maxo;
		maxo=0;
		for(j=0;j<dims[1]*dims[2];j++) if(var[j]>maxo) maxo=var[j];
		printf(" maxo: %d\n", maxo);
		
		printf(" Sobel edge detection...\n");
		sobel(var, sob, dims[1], dims[2]);
		
		/* reduce the output of sobel before watershed;
		 * this greatly reduces processing time */
		/* TODO: infer this from the actual histographic data */
		for(j=0;j<dims[1]*dims[2];j++) sob[j] /= 10;
		for(j=0;j<dims[1]*dims[2];j++) if(sob[j]>255) sob[j]=255;
		
		printf(" watershed assembly...\n");
		if(watershed_rep(sob, wsh, tmp1, dims[1], dims[2], xmark, ymark, 2, buf, 8, 8.0)){
			printf(" error during watershed!\n");
			return 1;
		}
		
		/* print center of mass to file */
		fprintf(comf,"%d %d %d\n", i, xmark[1], ymark[1]);
		
		/* modify mark */
		if(center_of_mass(buf, dims[1], dims[2], 8, xmark+1, ymark+1)){
			printf(" zero identified regions!\n aborting.\n");
		    break;	/* abort so we can at least see the results */
		}
		
		/* output superimposed image */
		for(j=0;j<dims[1]*dims[2];j++)
			wsh[j] = prev[j] >> 4;
		
		hardedge(buf, wsh, dims[1], dims[2]);
		sprintf(fname,"vesw_sup_%04d.pgm",i);
		export_8bit_pgm(wsh, dims[1], dims[2], fname);
		sprintf(cmdlin,"pnmtopng < %s > vesw_sup_%04d.png\nrm %s\n", fname, i, fname);
		if(system(cmdlin)){
			printf("Error during NetPbm invoke!\n");
			return 55;
		}
		
    }

	buf[ymark[1]*dims[1] + xmark[1]]=255-buf[ymark[1]*dims[1] + xmark[1]];	/* mark next CoM */
	export_8bit_pgm(buf, dims[1], dims[2], "vesw.pgm");
		
	for(j=0;j<dims[1]*dims[2];j++) buf[j] = var[j]/64;
	export_8bit_pgm(buf, dims[1], dims[2], "ve.pgm");

	for(j=0;j<dims[1]*dims[2];j++) buf[j] = sob[j]/8;
	export_8bit_pgm(buf, dims[1], dims[2], "ves.pgm");
	
	fclose(comf);
	
    /* no need to free memory; that's just silly */
   
    IcsClose(ics);
    return 0;
}