Dear list,
when I have a z-stack (RGB) and view this stack with the orthogonal views switched on, I can play that stack, i.e. move through the z-stack and the yellow cross-hair is moving in parallel in the yz and xz view. Is there a way of saving this whole view, i.e. xy, yz and xz including the moving yellow crosshair in one series/avi? Thanks, Martin |
Martin,
On 2012.10.04, at 15:59 , Martin Höhne wrote: > Is there a way of saving this whole view, i.e. xy, yz and xz including the > moving yellow crosshair in one series/avi? You could use the Image>Stacks>Reslice command to obtain the orthogonal projections. Here is an exemplifying macro: // ---- --- run("T1 Head (2.4M, 16-bits)"); img = getImageID(); getVoxelSize(width, height, depth, unit); vws = newArray("Top", "Left", "Bottom", "Right"); setBatchMode(true); // Create projections for (i=0; i<vws.length; i++) { selectImage(img); rtt = ""; if (i%2) rtt = " rotate"; run("Reslice [/]...", "output="+ depth +" start="+ vws[i] + rtt); rename(vws[i]); } // combine top views run("Combine...", "stack1="+ vws[0] +" stack2="+ vws[2] +" combine"); rename("TB"); // Append side views run("Combine...", "stack1="+ vws[1] +" stack2=TB"); rename("LTB"); run("Combine...", "stack1=LTB stack2="+ vws[3]); setBatchMode("exit & display"); doCommand("Start Animation [\\]"); // ---- --- Alternatively, you could try the 3D Viewer (orthoslice view) or Volume Viewer plugins. HTH, -tiago -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html |
Tiago,
thank you very much for leading me into the right direction! Martin |
In reply to this post by Tiago Ferreira-2
meanwhile I managed to write a macro that does what I want. Just in case anyone is interested.
Martin ------------- /* * Macro to fullfill this task I asked for in the ImageJ-list: * Dear list, * when I have a z-stack (RGB) and view this stack with the orthogonal views switched on, * I can play that stack, i.e. move through the z-stack and the yellow cross-hair is * moving in parallel in the yz and xz view. * Is there a way of saving this whole view, i.e. xy, yz and xz including the moving * yellow crosshair in one series/avi? * * The idea how to solve this (use reslice and combine stacks) is from the reply from Tiago Ferreira. * * * Martin Hoehne 2012-10-08 * */ macro "Ortho view movie" { if (nImages()!=0) exit ("please close all other images before running the macro"); //open file and create results dir // path = File.openDialog("Select the file"); // open(path); run("Bat Cochlea Volume (19K)"); //works as a testfile getDimensions(width, height, channels, slices, frames); getVoxelSize(voxwidth, voxheight, depth, unit); run("Orthogonal Views"); msg1 = "\nPostion the crosshair in the xy window."+ "\n(original stack)"+ "\n \nWhen done, continue with <OK>"; waitForUser(msg1); setBatchMode(true); // get the position where the user has put the yellow cross-hair in the xy-stack for (i=1; i<=3; i++){ img=getTitle(); if (substring(img,0,2)=="YZ") { yzID = getImageID(); x=coord(img); rename("YZ_"+x); //no space in title allowed to combine stacks later in macro yztitle=getTitle(); } if (substring(img,0,2)=="XZ") { xzID = getImageID(); y=coord(img); rename("XZ_"+y); //no space in title allowed to combine stacks later in macro xztitle=getTitle(); } close(); // in the first round the original image is still selected and closed // in the next two round the YZ and XZ views are selected, resp. // I could not find another way of getting hold of the titles of the // XZ and YZ windows } // image has to be reopened run("Bat Cochlea Volume (19K)"); //open(path); run("RGB Color"); imgID=getImageID(); setLineWidth(20); // reslice YZ (single slice at the position (x) chosen by the user selectImage(imgID); makeLine(x,0,x,height); run("Add Selection...", "stroke=green width=1"); //add the vertical crosshair line to the selection run("Reslice [/]...", "output="+ depth+" slice_count=1 rotate"); getDimensions(w,h,c,s,f); //dimensions are dependent on depth, i.e. slice thickness // green frame around the image setBackgroundColor(0,255,0); run("Canvas Size...","width="+w+4+" height="+h+4+" position=Center"); rename("YZ_"+ x); orthoYZ=getImageID(); makestack(orthoYZ, slices, width, height, voxwidth, voxheight, depth, 1); // reslice XZ (single slice at the position (y) chosen by the user selectImage(imgID); makeLine(0,y,width,y); run("Add Selection...", "stroke=orange width=1"); //add the horizontal crosshair line to the selection run("Reslice [/]...", "output="+ depth+" slice_count=1"); getDimensions(w,h,c,s,f); //dimensions are dependent on depth, i.e. slice thickness // orange frame around the image setBackgroundColor(255,153,0); run("Canvas Size...","width="+w+4+" height="+h+4+" position=Center"); rename("XZ_"+ y); orthoXZ=getImageID(); makestack(orthoXZ, slices, width, height, voxwidth, voxheight, depth, 2); // Flatten the crosshair onto the original xy-stack selectImage(imgID); run("Flatten", "stack"); // white frame around the image setBackgroundColor(255, 255, 255); run("Canvas Size...", "width="+width+4+" height="+height+4+" position=Center"); // combine views stk1=getTitle(); setBackgroundColor(40, 40, 40); run("Combine...", "stack1="+ stk1 +" stack2="+ yztitle); rename("combi1"); run("Combine...", "stack1=combi1" +" stack2="+ xztitle +" combine"); setBatchMode(false); // grey frame around the image + labeling getDimensions(w,h,c,s,f); //dimensions of the combined stacks run("Canvas Size...", "width="+w+20+" height="+h+40+" position=Center"); setFont("Sanserif", 14); makeText("xy view", 20, 0); run("Add Selection...", "stroke=white"); makeText("xz view", 20, h+18); run("Add Selection...", "stroke=orange"); makeText("yz view", w-44,0); run("Add Selection...", "stroke=green"); // stupid command to unselect the "yz view" text -- most likely there are more elegant ways makePoint(w*2, h); } //-FUNCTIONS-----------------------------------------------------------------------------------// function coord(imgname) { // function returns the x or y value of the selected section. Extracted from the image title //(e.g. title = YZ 123) --> 123 is returned string=substring(imgname,3,lengthOf(imgname)); return parseInt(string);//Converts string to an integer and returns it. Returns NaN if the string cannot be converted into a integer. } function makestack(imgID, slices, xmax, ymax, voxwidth, voxheight, depth, orient) { // duplicate the YZ or the XZ image resp. z-times (i.e. make a stack with // identical number of slices as the original x-y-z stack. // Draw a line in each of the images indicating a different z-position. If the z-slice // is thicker than 1 pixel (interpolated) the line is drawn in the middle of the slice position // // The last argument of the function (orient) is needed for the orientation setForegroundColor(255, 255, 255); neuID = getImageID(); titel = getTitle(); run("Select All"); run("Copy"); run("Duplicate...", "title=["+titel+"]"); dup=getImageID(); selectImage(neuID); close(); selectImage(dup); for (i=0; i<slices; i++) { run("Paste"); // draw line indicating the z-plane if (orient==1) { zspace=depth/voxwidth; //take thickness of z-slices into account drawLine(i*zspace+zspace/2,2,i*zspace+zspace/2,ymax+1); } if (orient==2) { zspace=depth/voxheight; drawLine(2,i*zspace+zspace/2,xmax+1,i*zspace+zspace/2); } run("Add Slice"); } run("Delete Slice"); } |
I can not get this macro to work. I'm currently trying to save orthogonal
views on z-stack RGB images as well... Which portions of the macro needs editing by myself and where do I get the information I need to plugin? For example: it's saying I have a problem with making the YZ slice at this line: makestack(orthoYZ, slices, width, height, voxwidth, voxheight, depth, 1); -- Sent from: http://imagej.1557.x6.nabble.com/ -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html |
Free forum by Nabble | Edit this page |