I also confirm the same behaviour when replacing original file by OME sample data : http://www.openmicroscopy.org/Schemas/Samples/2013-06/bioformats-artificial/multi-channel-4D-series.ome.tif.zip.
-- Hadrien Mary Ph.D student in Biology Tournier-Gachet Team CNRS - LBCMCP - UMR 5088 Université de Toulouse - Bât. 4R3B1 118, route de Narbonne - 31062 Toulouse On Fri, Jan 9, 2015 at 6:46 PM, Hadrien Mary <hadrien.m...@gmail.com> wrote: > After some investigations I think there is a bug with ImgSaver. In the > following script, X, Y crop is fine but axes informations (T and Z) > are lost and all frames appears on the same axes. Now if I replace > "target = "/home/hadim/cropped.tif" by "target = > "/home/hadim/cropped.ome.tif" on line 9. X, Y crop fails, cropped > image has the same dimensions than original however axes informations > (T and Z) are ok. Note that in cropped.ome.tif, pixel values are > totally incoherent which is not the case in cropped.tif. > > Files can be found here : > https://arwen.hadim.fr/public.php?service=files&t=71aa17336dcccb3437d9a3dff789d2c0 > > Archive contains cropped.tif, cropped.ome.tif and original.ome.tif. > > The script: > > --------------------------------------------------- > from io.scif import SCIFIO > from io.scif.config import SCIFIOConfig > from io.scif.img import ImageRegion > from io.scif.img import ImgOpener > from io.scif.img import ImgSaver > from net.imglib2.meta import Axes > > fname = "/home/hadim/original.ome.tif" > target = "/home/hadim/cropped.tif" > > axes = [Axes.X, Axes.Y] > ranges = ["%i-%i" % (0, 15), "%i-%i" % (0, 25)] > config = SCIFIOConfig() > config.imgOpenerSetRegion(ImageRegion(axes, ranges)) > > opener = ImgOpener() > imps = opener.openImgs(fname, config) > imp = imps[0] > > saver = ImgSaver() > saver.saveImg(target, imp) > > print('Done') > --------------------------------------------------- > > > -- > Hadrien Mary > > > On Fri, Jan 9, 2015 at 12:25 AM, Hadrien Mary <hadrien.m...@gmail.com> wrote: >> Thanks for the tip (reminder to me: always look for example in tests!). >> >> Unfortunately crop does not work... I will try to do more tests >> tomorrow or wait for you or someone else to have a look. >> >> Updated code: >> >> from ij import IJ >> from ij import ImagePlus >> >> from io.scif import SCIFIO >> from io.scif.config import SCIFIOConfig >> from io.scif.img import ImageRegion >> from io.scif.img import ImgOpener >> from io.scif.img import ImgSaver >> from net.imglib2.meta import Axes >> >> fname = "/home/hadim/original.ome.tif" >> target = "/home/hadim/cropped.ome.tif" >> >> axes = [Axes.X, Axes.Y] >> ranges = ["%i-%i" % (2, 15), "%i-%i" % (2, 25)] >> config = SCIFIOConfig() >> config.imgOpenerSetRegion(ImageRegion(axes, ranges)) >> >> opener = ImgOpener() >> imps = opener.openImgs(fname, config) >> imp = imps[0] >> >> saver = ImgSaver() >> saver.saveImg(target, imp) >> >> print('Done') >> >> -- >> Hadrien Mary >> >> >> On Fri, Jan 9, 2015 at 12:09 AM, Curtis Rueden <ctrue...@wisc.edu> wrote: >>> Hi Hadrien, >>> >>>> I would like to be able to crop a region in X and Y while >>>> keeping any other dimensions which could exist (C, Z, T). >>> >>> Here's some Java: >>> >>> int minX = 128, maxX = 255, minY = 128, minY = 255; >>> AxisType[] axes = { Axes.X, Axes.Y }; >>> String[] ranges = { minX + "-" + maxX, minY + "-" + maxY }; >>> config.imgOpenerSetRegion(new ImageRegion(axes, ranges)); >>> >>> Adapted from here: >>> https://github.com/scifio/scifio/blob/scifio-0.18.0/src/test/java/io/scif/img/utests/ImgOpenerTest.java#L189-L191 >>> >>> And untested. >>> >>> HTH, >>> Curtis >>> >>> On Thu, Jan 8, 2015 at 4:47 PM, Hadrien Mary <hadrien.m...@gmail.com> wrote: >>>> >>>> After some investigations, I'm pretty sure I don't instanciate >>>> ImageRegion correctly. Doc and source code didn't help me... I would >>>> like to be able to crop a region in X and Y while keeping any other >>>> dimensions which could exist (C, Z, T). >>>> >>>> -- >>>> Hadrien Mary >>>> >>>> >>>> >>>> On Thu, Jan 8, 2015 at 10:22 PM, Hadrien Mary <hadrien.m...@gmail.com> >>>> wrote: >>>> > Thank you Curtis for the answer. >>>> > >>>> > I tried to apply what you told me and the code now works without >>>> > error. However the saved cropped image is not cropped (same size as >>>> > original) and pixel values are modified). >>>> > >>>> > Script: >>>> > >>>> > from io.scif.config import SCIFIOConfig >>>> > from io.scif.img import ImageRegion >>>> > from io.scif.img import ImgOpener >>>> > from io.scif.img import ImgSaver >>>> > >>>> > fname = "/home/hadim/original.ome.tif" >>>> > target = "/home/hadim/cropped.ome.tif" >>>> > >>>> > config = SCIFIOConfig() >>>> > region = ImageRegion(dict(x=2, y=2, width=10, height=10)) >>>> > config.imgOpenerSetRegion(region) >>>> > >>>> > opener = ImgOpener() >>>> > imps = opener.openImgs(fname, config) >>>> > imp = imps[0] >>>> > >>>> > print(imps) >>>> > >>>> > saver = ImgSaver() >>>> > saver.saveImg(target, imp) >>>> > >>>> > Thanks again for your time. Don't be sorry if you don't have time to >>>> > write an example. >>>> > >>>> > I will be happy to provide some python/scifio examples scripts. >>>> > >>>> > >>>> > -- >>>> > Hadrien Mary >>>> > >>>> > Ph.D student in Biology >>>> > Tournier-Gachet Team >>>> > CNRS - LBCMCP - UMR 5088 >>>> > >>>> > Université de Toulouse - Bât. 4R3B1 >>>> > 118, route de Narbonne - 31062 Toulouse >>>> > >>>> > >>>> > On Thu, Jan 8, 2015 at 9:56 PM, Curtis Rueden <ctrue...@wisc.edu> wrote: >>>> >> Hi Hadrien, >>>> >> >>>> >>> I tried to use SCIFIO to write cropped image on disk but it doesn not >>>> >>> work. >>>> >> >>>> >> The error you see is because SCIFIO operates on ImgLib2 data >>>> >> structures, not >>>> >> ImagePlus objects. >>>> >> >>>> >>> Is there is any “easy” alternative to BF setCropRegion function in >>>> >>> SCIFIO ? >>>> >> >>>> >> Yes: you create a SCIFIOConfig, calling imgOpenerSetRegion [1] on it, >>>> >> then >>>> >> pass it as an argument to the ImgOpener. You'll get back an ImgLib2 >>>> >> data >>>> >> object which can then be fed to the SCIFIO ImgSaver. >>>> >> >>>> >> I'm sorry that I don't have time to whip up an example for you right >>>> >> now. It >>>> >> would be great to add more SCIFIO tutorials [2] that use the ImgOpener >>>> >> and >>>> >> ImgSaver, since they are much higher level APIs akin to the Bio-Formats >>>> >> "BF" >>>> >> functionality... please feel welcome to contribute some! >>>> >> >>>> >> Regards, >>>> >> Curtis >>>> >> >>>> >> [1] >>>> >> >>>> >> http://javadoc.imagej.net/SCIFIO/io/scif/config/SCIFIOConfig.html#imgOpenerSetRegion(io.scif.img.ImageRegion) >>>> >> [2] https://github.com/scifio/scifio-tutorials >>>> >> >>>> >> On Thu, Jan 8, 2015 at 2:18 PM, Hadrien Mary <hadrien.m...@gmail.com> >>>> >> wrote: >>>> >>> >>>> >>> Hi, >>>> >>> >>>> >>> I am writing a python macro which iterate over all rois in ROI Manager >>>> >>> and then use setCropRegion function from bioformat plugin to open a >>>> >>> cropped region of an image. >>>> >>> >>>> >>> I tried to use SCIFIO to write cropped image on disk but it doesn not >>>> >>> work. >>>> >>> >>>> >>> (I am using an updated version of Fiji.) >>>> >>> >>>> >>> Here is my script: >>>> >>> >>>> >>> from ij.plugin.frame import RoiManager >>>> >>> from ij import IJ >>>> >>> from io.scif.img import ImgSaver >>>> >>> >>>> >>> from loci.plugins import BF >>>> >>> from loci.plugins.in import ImporterOptions >>>> >>> from loci.common import Region >>>> >>> >>>> >>> import os >>>> >>> >>>> >>> # Get current image filename >>>> >>> imp = IJ.getImage() >>>> >>> f = imp.getOriginalFileInfo() >>>> >>> fname = os.path.join(f.directory, f.fileName) >>>> >>> >>>> >>> IJ.log('Image filename is %s' % fname) >>>> >>> >>>> >>> # Iterate over all ROIs from ROI Manager >>>> >>> rois = RoiManager.getInstance().getRoisAsArray() >>>> >>> for i, roi in enumerate(rois): >>>> >>> >>>> >>> crop_id = i +1 >>>> >>> IJ.log("Opening crop %i / %i" % (crop_id, len(rois))) >>>> >>> >>>> >>> bounds = roi.getBounds() >>>> >>> >>>> >>> x = bounds.x >>>> >>> y = bounds.y >>>> >>> w = bounds.width >>>> >>> h = bounds.height >>>> >>> >>>> >>> # Import only cropped region of the image >>>> >>> options = ImporterOptions() >>>> >>> options.setCrop(True) >>>> >>> options.setCropRegion(0, Region(x, y, w, h)) >>>> >>> options.setId(fname) >>>> >>> imps = BF.openImagePlus(options) >>>> >>> >>>> >>> imp = imps[0] >>>> >>> imp.show() >>>> >>> >>>> >>> crop_basename = "crop%i_%s" % (crop_id, f.fileName) >>>> >>> crop_fname = os.path.join(f.directory, crop_basename) >>>> >>> imp.setTitle(crop_basename) >>>> >>> >>>> >>> # Save image >>>> >>> IJ.log("Saving crop to %s" % crop_fname) >>>> >>> saver = ImgSaver() >>>> >>> saver.saveImg(crop_basename, imp) >>>> >>> >>>> >>> IJ.log('Done') >>>> >>> >>>> >>> It fails with this error: >>>> >>> >>>> >>> Traceback (most recent call last): >>>> >>> File "/home/hadim/local/Fiji.app/plugins/Crop_Multi_Roi.py", line >>>> >>> 49, in <module> >>>> >>> saver.saveImg(crop_basename, imp) >>>> >>> TypeError: saveImg(): 1st arg can't be coerced to io.scif.Writer, >>>> >>> String >>>> >>> >>>> >>> at org.python.core.Py.TypeError(Py.java:235) >>>> >>> at >>>> >>> >>>> >>> org.python.core.PyReflectedFunction.throwError(PyReflectedFunction.java:209) >>>> >>> at >>>> >>> >>>> >>> org.python.core.PyReflectedFunction.throwBadArgError(PyReflectedFunction.java:312) >>>> >>> at >>>> >>> >>>> >>> org.python.core.PyReflectedFunction.throwError(PyReflectedFunction.java:321) >>>> >>> at >>>> >>> >>>> >>> org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:167) >>>> >>> at >>>> >>> >>>> >>> org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:204) >>>> >>> at org.python.core.PyObject.__call__(PyObject.java:422) >>>> >>> at org.python.core.PyObject.__call__(PyObject.java:426) >>>> >>> at org.python.core.PyMethod.__call__(PyMethod.java:139) >>>> >>> at >>>> >>> >>>> >>> org.python.pycode._pyx7.f$0(/home/hadim/local/Fiji.app/plugins/Crop_Multi_Roi.py:51) >>>> >>> at >>>> >>> >>>> >>> org.python.pycode._pyx7.call_function(/home/hadim/local/Fiji.app/plugins/Crop_Multi_Roi.py) >>>> >>> at org.python.core.PyTableCode.call(PyTableCode.java:165) >>>> >>> at org.python.core.PyCode.call(PyCode.java:18) >>>> >>> at org.python.core.Py.runCode(Py.java:1275) >>>> >>> at >>>> >>> >>>> >>> org.scijava.plugins.scripting.jython.JythonScriptEngine.eval(JythonScriptEngine.java:76) >>>> >>> at org.scijava.script.ScriptModule.run(ScriptModule.java:175) >>>> >>> at org.scijava.module.ModuleRunner.run(ModuleRunner.java:167) >>>> >>> at org.scijava.module.ModuleRunner.call(ModuleRunner.java:126) >>>> >>> at org.scijava.module.ModuleRunner.call(ModuleRunner.java:65) >>>> >>> at >>>> >>> >>>> >>> org.scijava.thread.DefaultThreadService$2.call(DefaultThreadService.java:164) >>>> >>> at java.util.concurrent.FutureTask.run(FutureTask.java:262) >>>> >>> at >>>> >>> >>>> >>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) >>>> >>> at >>>> >>> >>>> >>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) >>>> >>> at java.lang.Thread.run(Thread.java:745) >>>> >>> >>>> >>> Three questions: >>>> >>> >>>> >>> how can I write cropped image (I need to write them as OME Tiff so I >>>> >>> need BF or SCIFIO). >>>> >>> Is there is any “easy” alternative to BF setCropRegion function in >>>> >>> SCIFIO >>>> >>> ? >>>> >>> I am currently using RoiManager.getInstance().getRoisAsArray() to >>>> >>> retrieve all rois. How can I directly get a ROIManager instance from >>>> >>> RoiSet.zip file ? >>>> >>> >>>> >>> Any help would be very appreciated. >>>> >>> >>>> >>> Thanks ! >>>> >>> >>>> >>> — >>>> >>> Hadrien Mary >>>> >>> >>>> >>> _______________________________________________ >>>> >>> ImageJ-devel mailing list >>>> >>> ImageJ-devel@imagej.net >>>> >>> http://imagej.net/mailman/listinfo/imagej-devel >>>> >> >>>> >> >>> >>> _______________________________________________ ImageJ-devel mailing list ImageJ-devel@imagej.net http://imagej.net/mailman/listinfo/imagej-devel