var IJPath="C:\\Program Files\\ImageJ-FIJI\\"; //cestu nech v uvozovkach. Mozna budes muset separatory zmenit napriklad ve win z \ na \\. var original, originalID, name; var option; var Sn,Sx,Sy,Sxx,Syy,Sxy,rot2,density,Centrex,Centrey,Theta, R1,R2; var original, scalar, units, TA, CA, Cx, Cy, Ix, Iy, Imax, Imin, Zx, Zy, Xmaxrad, Ymaxrad, xmin, ymin, xmax, ymax; macro "Batch measure [n0]" { //zmeri vsechny pozadovane soubory v adresari if (is("Batch Mode")) setBatchMode(false); option=getOptions(); if (!File.isDirectory(option[5])) { option[5]=getDirectory("Choose a measurements output directory"); // option[4]=false; setOptions(option); } inputPath=getDirectory("Choose a directory with INPUT data"); Dialog.create("Input options"); Dialog.addMessage("Choose type of data to measure"); Dialog.addChoice("Image type:", newArray(".TIFF [images]", ".zip [selections]")); Dialog.show(); dataType = Dialog.getChoice(); //get dataType for analysis; if (dataType==".TIFF [images]") dataType=".tif"; if (dataType==".zip [selections]") dataType=".zip"; fileList=getFileList(inputPath); for (i=0; i1) { do {waitForUser("Automatic Outer confused", "Please select manualy appropriate selection in ROI manager.\nAlternatively add new selection by pressing 't' end select.\nThen press OK."); } while (roiManager("index")==-1); roiManager("Select", roiManager("index")); roiManager("reset"); roiManager("Add"); } }while (!roiManager("count")==1) run("Paste"); setAutoThr(); roiManager("Select", 0); roiManager("Rename", "Outer"); } //****************************************CHECKROIS******************************************** function checkROIs() { while (roiManager("count")!=2) waitForUser("Too many ROIs in Manager", "Please leave only outer and inner selection in ROI manager.\nThen press OK."); roiManager("Deselect"); resetMinAndMax(); roiManager("XOR"); } //*************************************** DRAWAXES ******************************************** function DrawAxis() { //optional function to draw major/minor axis of ellipse run("Select None"); moveTo(Centrex,Centrey); setColor(255,255,255); lineTo(Centrex-(cos((0-Theta)*3.141592654/180)*2*R1), Centrey+(sin((0-Theta)*3.141592654/180)*2*R1)); moveTo(Centrex,Centrey); lineTo(Centrex-(cos((Theta+90)*3.141592654/180)*2*R2), Centrey-(sin((Theta+90)*3.141592654/180)*2*R2)); moveTo(Centrex,Centrey); lineTo(Centrex+(cos((0-Theta)*3.141592654/180)*2*R1), Centrey-(sin((0-Theta)*3.141592654/180)*2*R1)); moveTo(Centrex,Centrey); lineTo(Centrex+(cos((Theta+90)*3.141592654/180)*2*R2), Centrey+(sin((Theta+90)*3.141592654/180)*2*R2)); } //**************************** SQR****************** function sqr(n) { return n*n; } //*******************************CALCSUMS******************************************************* function CalcSums() { Sn=0; Sx=0; Sy=0; Sxx=0; Syy=0; Sxy=0; vyska=ymin+ymax; sirka=xmin+xmax; for (y=ymin; y<=vyska; y++) { showStatus("Calculation in progress....."); showProgress(y/ymax); for (x=xmin; x<=sirka; x++) { if (selectionContains(x, y)==true){ Sn=Sn+1; Sx=Sx+(x*cos(rot2)+y*sin(rot2)); Sy=Sy+(y*cos(rot2)-x*sin(rot2)); Sxx=Sxx+sqr((x*cos(rot2)+y*sin(rot2))); Syy=Syy+sqr((y*cos(rot2)-x*sin(rot2))); Sxy=Sxy+((y*cos(rot2)-x*sin(rot2))*(x*cos(rot2)+y*sin(rot2))); } } } } //************************************ MEASURE MOMENTS******************************************* function measureMoments(){// This macro calculates the anisometry and bulkiness of binary particles // based on the dynamically equivalent ellipse as defined by Medalia (1970). setBatchMode(true); getPixelSize(unit, pixelWidth, pixelHeight); scalar=pixelWidth; units=unit; selectImage(originalID); getSelectionBounds(xmin,ymin,xmax,ymax); // ymin is measured from top,xmin from left // xmax & ymax= diameters along x & y axes //Calculate Moments CalcSums(); if (Sn==0) { showMessage("Selection too narrow. Exit calculation"); exit; } Cx=Sx/Sn-1; //x-coord. of Centroid Cy=Sy/Sn-1; //y-coord. of Centroid Centrex=Cx; Centrey=Cy; // following code calculates y (dist from neutral axis) if (((ymax + ymin) - Cy) > (Cy - ymin)) { Ymaxrad= ymax + ymin - Cy; Yminrad= Cy - ymin; BigY= Ymaxrad; } else { Ymaxrad= Cy - ymin; Yminrad= ymax + ymin - Cy; BigY= Ymaxrad; } // following code calculates x (dist from neutral axis) if (((xmax + xmin) - Cx) > (Cx - xmin)) { Xmaxrad= xmax + xmin - Cx; Xminrad= Cx - xmin; BigX= Xmaxrad; } else { Xmaxrad= Cx - xmin; Xminrad= xmax + xmin - Cx; BigX= Xmaxrad; } Xmaxrad= Xmaxrad*scalar; //calibrating radii Xminrad= Xminrad*scalar; Ymaxrad= Ymaxrad*scalar; Yminrad= Yminrad*scalar; Myy=Sxx-(Sx*Sx/Sn); Mxx=Syy-(Sy*Sy/Sn); Mxy=Sxy-(Sx*Sy/Sn); if (Mxy==0) { Theta=0; } else { Theta=atan(((Mxx-Myy)+sqrt(sqr(Mxx-Myy)+(4*sqr(Mxy))))/(2*Mxy))*180/3.141592654; } //end CA Cx = Cx*scalar; //save x-coord of centroid Cy= Cy*scalar; //save y-coord of centroid BigX= BigX*scalar; //calibrating x,y,Cx,Cy BigY= BigY*scalar; Ix= Mxx*(sqr(sqr(scalar))); //save mom about x-axis Iy= Myy*(sqr(sqr(scalar))); Zx= Ix/BigY; //save section moduli Zy= Iy/BigX; rot2=Theta*3.141592654/180; CalcSums(); Parea=Sn; M1=Sxx-(Sx*Sx/Sn); M2=Syy-(Sy*Sy/Sn); R1=sqrt(M1/Parea); R2=sqrt(M2/Parea); Imax= M1*(sqr(sqr(scalar))); Imin= M2*(sqr(sqr(scalar ))); Rmaks= R1*scalar; Rmyn= R2*scalar; rot2=0; //Theta= -Theta; //REMOVED due to no apparent function and gives incorrect principal axes (5/24/2005) //calculate TA roiManager("Deselect"); roiManager("OR"); getStatistics(Tarea); roiManager("AND"); getStatistics(Carea); TA = Tarea; CA= Tarea-Carea; //end TA setBatchMode(false); } // End of main macro "Calculating Moments" //********************************************save results******************************************************* function saveResults(){ setForegroundColor(255, 255, 255); setBackgroundColor(0,0,0); Stack.getDimensions(width, height, channels, slices, frames); //Draw selection selectImage(originalID); Stack.setDisplayMode("color"); Stack.setChannel(channels-1); clearChannel(); roiManager("Deselect"); roiManager("XOR"); run("Draw", "slice"); resetMinAndMax(); //Draw principal axes Stack.setChannel(channels); clearChannel(); DrawAxis(); resetMinAndMax(); Stack.setDisplayMode("composite"); //displays the results in the upper left corner of the text window path=option[5]; name=indexName(name); setFont('Monaco',10); tab=fromCharCode(0009); if(!isOpen("Log")) { print("Name"+tab+"Scale"+tab+"TA"+tab+"CA"+tab+"Xbar"+tab+"Ybar"+tab+"Ix"+tab+"Iy"+tab+"Imax"+tab+"Imin"+tab+"Theta"+tab+"Zx"+tab+"Zy"+tab+"MaxXrad"+tab+"MaxYrad"); } print(name+tab+scalar+units+"/pixel"+tab+TA+tab+CA+tab+Cx+tab+Cy+tab+Ix+tab+Iy+tab+Imax+tab+Imin+tab+Theta+tab+Zx+tab+Zy+tab+Xmaxrad+tab+Ymaxrad); run("Channels Tool... "); selectWindow("Log"); saveAs("Text", path+name+".txt"); // File>Save As>Text selectImage(originalID); activeChannels=activateChannels(channels); Stack.setActiveChannels(activeChannels); run("Stack to RGB"); saveAs("Tiff", path+name+".tif"); close(); roiManager("Deselect"); roiManager("Save", path+name+".zip"); selectImage(originalID); rename(name+".tif"); } // End of "saveResults" //********************** activate channels ******************** function activateChannels(channels) { array=newArray(channels); Array.fill(array, 1); if (!option[2]) array[channels-2]=0; if (!option[3]) array[channels-1]=0; string=""; for (i=0; i