Dear List,
after some improvement from Thorsten Wagner on the "Watershed Irregular Features" function of my Toolbox (thanks Thorsten) and some additional modifications by myself, I encounter the following issue after a batch processing test and running it on stacks. The watershed plugin is designed in a way that internally it is working with a results table which works well. However, as soon as a results table is open and contains results during batch processing it was reset after each watershed function. I therefore considered simply to rename the table during the watershed process and retrieve it afterwards since I am not aware of any more elegant solution to circumvent that problem. What is inconvenient in this approach is that an existing results table is constantly renewed or popping up if different values are keyed in during preview mode or after watershedding a single slide when running it on a stack. This version is still not available as an update, since I first wanted to solve this issue. Below you can find the corresponding java code for those how want to have a look or test the described behaviour. I am grateful for any suggestions on more elegant solutions. Thanks, Jan //---------------------------------- import ij.*; import ij.process.*; import ij.gui.*; import java.awt.*; import ij.plugin.filter.*; import ij.measure.Measurements; import ij.measure.ResultsTable; import ij.text.TextWindow; import ij.plugin.frame.PlugInFrame; import ij.gui.DialogListener; import ij.gui.GenericDialog; import ij.plugin.filter.EDM; import ij.plugin.ImageCalculator; import ij.plugin.filter.ParticleAnalyzer; /** * Watershed Irregular Features * * The plugin might serve to reduce artifacts created by the normal * watershed algorithm implicated in ImageJ when applied to objects * of irregular shape containing relatively small connections between them. * * Copyright (C), 2014, Jan Brocher / BioVoxxel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * IN NO EVENT WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES * AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, * INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING * OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO * LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR * THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), * EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF * SUCH DAMAGES. * * Please cite BioVoxxel and Jan Brocher when you publish results * obtained by usage of this plugin or a modified version of it * * Thank you * * May 04, 2015: Bug fix: Now correctly works with stacks (Thorsten Wagner, [hidden email]) * May 08, 2015: Bug fix: when used during batch analysis results table were reset. This behaviour corrected * */ public class Watershed_Irregular_Features implements ExtendedPlugInFilter, DialogListener { ImagePlus imp; private double erosions = 1; private PlugInFilterRunner pfr; private int nPasses = 1; private int pass; private int flags = DOES_8G|KEEP_PREVIEW|SNAPSHOT; public int setup(String arg, ImagePlus imp) { this.imp = imp; if(!imp.getProcessor().isBinary()) { IJ.error("works only on 8-bit binary images"); return DONE; } else { return DOES_8G | DOES_STACKS; } } public int showDialog(ImagePlus imp, String command, PlugInFilterRunner pfr) { GenericDialog gd = new GenericDialog("Watershed Irregular Features"); gd.addNumericField("erosion cycle number:", erosions, 1, 5, ""); gd.addPreviewCheckbox(pfr); // passing pfr makes the filter ready for preview gd.addDialogListener(this); // the DialogItemChanged method will be called on user input gd.addHelp(" http://fiji.sc/BioVoxxel_Toolbox#Watershed_Irregular_Structures"); gd.showDialog(); // display the dialog; preview runs in the background now if (gd.wasCanceled()) { return DONE; } IJ.register(this.getClass()); // protect static class variables (filter parameters) from garbage collection this.pfr = pfr; return IJ.setupDialog(imp, flags); // ask whether to process all slices of stack (if a stack) } public boolean dialogItemChanged(GenericDialog gd, AWTEvent e) { erosions = (int) gd.getNextNumber(); if (gd.invalidNumber() || erosions<1) { IJ.error("invalid number"); return false; } else { return true; } } public void run(ImageProcessor ip) { // ip.snapshot(); Prefs.blackBackground = true; TextWindow rttw = ResultsTable.getResultsWindow(); ResultsTable rt; if(rttw!=null) { rt = ResultsTable.getResultsTable(); IJ.renameResults("Results", "intermediateResults"); } boolean invertedLut = ip.isInvertedLut(); if(invertedLut) { ip.invertLut(); } ImagePlus origImp = new ImagePlus("",ip.duplicate()); ImageProcessor erosionIP = ip.duplicate(); ImagePlus erosionImp = new ImagePlus("", erosionIP); ImageProcessor watershedIP = ip.duplicate(); ImagePlus watershedImp = new ImagePlus("", watershedIP); //dilate objects according to erosion cycle number entered by user for(int n=0; n<=erosions; n++) { erosionIP.dilate(); } //separate original objects with the normal watershed algorithm from IJ EDM watershedEDM = new EDM(); watershedEDM.toWatershed(watershedIP); //first, the watershed separation lines are extracted //then, the second image calculation keeps only those separators //which overlap with an eroded particle ImageCalculator calculateImages = new ImageCalculator(); ImagePlus extractedSeparatorsImp = calculateImages.run("XOR create", watershedImp, origImp); ImagePlus remainingSeparatorsImp = calculateImages.run("AND create", extractedSeparatorsImp, erosionImp); //the remaining separator lines are analyzed to get their starting position //for later selection int options = ParticleAnalyzer.CLEAR_WORKSHEET|ParticleAnalyzer.RECORD_STARTS; int measurements = Measurements.CENTROID; ResultsTable resultsTable = new ResultsTable(); ParticleAnalyzer pa = new ParticleAnalyzer(options, measurements, resultsTable, 0.0, 999999999.9); pa.analyze(remainingSeparatorsImp); int xStart, yStart; watershedIP.setValue(255.0); //the remaining separation lines in their original size and orientation //are copied into the watersheded image to close undesired separations for(int r=0; r<resultsTable.getCounter(); r++) { xStart = (int)resultsTable.getValue("XStart", r); yStart = (int)resultsTable.getValue("YStart", r); IJ.doWand(extractedSeparatorsImp, xStart, yStart, 0.0, "8-connected"); Roi selectedSeparator = extractedSeparatorsImp.getRoi(); watershedIP.fill(selectedSeparator); } //watershedImp.show(); //the corrected watersheded image is copied into the original to be able to //undo the watershed if undesired //origImp.getProcessor().setPixels(watershedImp.getProcessor().getPixels()); if(invertedLut) { ip.invertLut(); } for(int i = 0; i < ip.getWidth(); i++){ for(int j =0; j < ip.getHeight(); j++){ ip.putPixel(i, j, watershedImp.getProcessor().getPixel(i, j)); } } /* //prepare all unused ImagePlus, ImageProcessor and Constructors for carbage collection watershedImp.close(); watershedEDM = null; erosionImp.close(); extractedSeparatorsImp.close(); remainingSeparatorsImp.close(); resultsTable = null; pa = null; */ if(rttw!=null) { IJ.renameResults("intermediateResults", "Results"); } } public void setNPasses (int nPasses) { this.nPasses = nPasses; pass = 0; } void showProgress(double percent) { percent = (double)(pass-1)/nPasses + percent/nPasses; IJ.showProgress(percent); } } //---------------------------------- -- CEO: Dr. rer. nat. Jan Brocher phone: +49 (0)6234 917 03 39 mobile: +49 (0)176 705 746 81 e-mail: [hidden email] info: [hidden email] inquiries: [hidden email] web: www.biovoxxel.de -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html |
Dear Jan,
if you leave away the `ParticleAnalyzer.CLEAR_WORKSHEET` option, you can leave the default Results table untouched and use as many private `ResultsTable` instances as you want. I made a Maven project of your BioVoxxel_Plugins collection and put it on github [1] to be able to show the changes more easily. Here's what I changed in your code: https://github.com/imagejan/BioVoxxel_Plugins/commit/99874cc In addition, I suggest to avoid displaying an intrusive error message when you allow a preview functionality. For example, when you delete the default number to enter a new one, the error message [2] interrupts the user. Instead, you can change the preview checkbox label: https://github.com/imagejan/BioVoxxel_Plugins/commit/8301b9d Hope that helps, Jan [1]: https://github.com/imagejan/BioVoxxel_Plugins [2]: https://github.com/imagejan/BioVoxxel_Plugins/blob/99874cc29be8417d0314a8cd9d038bb8a3ecd575/src/main/java/Watershed_Irregular_Features.java#L87 On 08.05.15 17:51, BioVoxxel wrote: > Dear List, > > after some improvement from Thorsten Wagner on the "Watershed Irregular > Features" function of my Toolbox (thanks Thorsten) and some additional > modifications by myself, I encounter the following issue after a batch > processing test and running it on stacks. > > The watershed plugin is designed in a way that internally it is working > with a results table which works well. However, as soon as a results table > is open and contains results during batch processing it was reset after > each watershed function. > I therefore considered simply to rename the table during the watershed > process and retrieve it afterwards since I am not aware of any more elegant > solution to circumvent that problem. What is inconvenient in this approach > is that an existing results table is constantly renewed or popping up if > different values are keyed in during preview mode or after watershedding a > single slide when running it on a stack. > > This version is still not available as an update, since I first wanted to > solve this issue. Below you can find the corresponding java code for those > how want to have a look or test the described behaviour. > > I am grateful for any suggestions on more elegant solutions. > > Thanks, > Jan > > > //---------------------------------- > import ij.*; > import ij.process.*; > import ij.gui.*; > import java.awt.*; > import ij.plugin.filter.*; > import ij.measure.Measurements; > import ij.measure.ResultsTable; > import ij.text.TextWindow; > import ij.plugin.frame.PlugInFrame; > import ij.gui.DialogListener; > import ij.gui.GenericDialog; > import ij.plugin.filter.EDM; > import ij.plugin.ImageCalculator; > import ij.plugin.filter.ParticleAnalyzer; > > /** > * Watershed Irregular Features > * > * The plugin might serve to reduce artifacts created by the normal > * watershed algorithm implicated in ImageJ when applied to objects > * of irregular shape containing relatively small connections between them. > * > * Copyright (C), 2014, Jan Brocher / BioVoxxel > * > * This program is free software: you can redistribute it and/or modify > * it under the terms of the GNU General Public License as published by > * the Free Software Foundation, either version 3 of the License, or > * (at your option) any later version. > * > * This program is distributed in the hope that it will be useful, > * but WITHOUT ANY WARRANTY; without even the implied warranty of > * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > * GNU General Public License for more details. > * > * IN NO EVENT WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES > * AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR > DAMAGES, > * INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES > ARISING > * OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT > LIMITED TO > * LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY > YOU OR > * THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER > PROGRAMS), > * EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY > OF > * SUCH DAMAGES. > * > * Please cite BioVoxxel and Jan Brocher when you publish results > * obtained by usage of this plugin or a modified version of it > * > * Thank you > * > * May 04, 2015: Bug fix: Now correctly works with stacks (Thorsten Wagner, > [hidden email]) > * May 08, 2015: Bug fix: when used during batch analysis results table > were reset. This behaviour corrected > * > */ > > > public class Watershed_Irregular_Features implements ExtendedPlugInFilter, > DialogListener { > ImagePlus imp; > private double erosions = 1; > private PlugInFilterRunner pfr; > private int nPasses = 1; > private int pass; > private int flags = DOES_8G|KEEP_PREVIEW|SNAPSHOT; > > public int setup(String arg, ImagePlus imp) { > this.imp = imp; > if(!imp.getProcessor().isBinary()) { > IJ.error("works only on 8-bit binary images"); > return DONE; > } else { > return DOES_8G | DOES_STACKS; > } > } > > public int showDialog(ImagePlus imp, String command, PlugInFilterRunner > pfr) { > GenericDialog gd = new GenericDialog("Watershed Irregular Features"); > gd.addNumericField("erosion cycle number:", erosions, 1, 5, ""); > gd.addPreviewCheckbox(pfr); // passing pfr makes the filter > ready for preview > gd.addDialogListener(this); // the DialogItemChanged method > will be called on user input > gd.addHelp(" > http://fiji.sc/BioVoxxel_Toolbox#Watershed_Irregular_Structures"); > gd.showDialog(); // display the dialog; preview runs in the > background now > if (gd.wasCanceled()) { > return DONE; > } > IJ.register(this.getClass()); // protect static class > variables (filter parameters) from garbage collection > this.pfr = pfr; > return IJ.setupDialog(imp, flags); // ask whether to process all > slices of stack (if a stack) > } > > public boolean dialogItemChanged(GenericDialog gd, AWTEvent e) { > erosions = (int) gd.getNextNumber(); > if (gd.invalidNumber() || erosions<1) { > IJ.error("invalid number"); > return false; > } else { > return true; > } > } > > public void run(ImageProcessor ip) { > // ip.snapshot(); > Prefs.blackBackground = true; > TextWindow rttw = ResultsTable.getResultsWindow(); > ResultsTable rt; > if(rttw!=null) { > rt = ResultsTable.getResultsTable(); > IJ.renameResults("Results", "intermediateResults"); > } > boolean invertedLut = ip.isInvertedLut(); > if(invertedLut) { > ip.invertLut(); > } > ImagePlus origImp = new ImagePlus("",ip.duplicate()); > ImageProcessor erosionIP = ip.duplicate(); > ImagePlus erosionImp = new ImagePlus("", erosionIP); > > ImageProcessor watershedIP = ip.duplicate(); > ImagePlus watershedImp = new ImagePlus("", watershedIP); > > //dilate objects according to erosion cycle number entered by user > for(int n=0; n<=erosions; n++) { > erosionIP.dilate(); > } > > //separate original objects with the normal watershed algorithm from IJ > EDM watershedEDM = new EDM(); > watershedEDM.toWatershed(watershedIP); > > //first, the watershed separation lines are extracted > //then, the second image calculation keeps only those separators > //which overlap with an eroded particle > ImageCalculator calculateImages = new ImageCalculator(); > ImagePlus extractedSeparatorsImp = calculateImages.run("XOR create", > watershedImp, origImp); > ImagePlus remainingSeparatorsImp = calculateImages.run("AND create", > extractedSeparatorsImp, erosionImp); > > //the remaining separator lines are analyzed to get their starting position > //for later selection > int options = > ParticleAnalyzer.CLEAR_WORKSHEET|ParticleAnalyzer.RECORD_STARTS; > int measurements = Measurements.CENTROID; > ResultsTable resultsTable = new ResultsTable(); > ParticleAnalyzer pa = new ParticleAnalyzer(options, measurements, > resultsTable, 0.0, 999999999.9); > > pa.analyze(remainingSeparatorsImp); > int xStart, yStart; > > watershedIP.setValue(255.0); > //the remaining separation lines in their original size and orientation > //are copied into the watersheded image to close undesired separations > for(int r=0; r<resultsTable.getCounter(); r++) { > xStart = (int)resultsTable.getValue("XStart", r); > yStart = (int)resultsTable.getValue("YStart", r); > IJ.doWand(extractedSeparatorsImp, xStart, yStart, 0.0, "8-connected"); > Roi selectedSeparator = extractedSeparatorsImp.getRoi(); > watershedIP.fill(selectedSeparator); > } > //watershedImp.show(); > //the corrected watersheded image is copied into the original to be able to > //undo the watershed if undesired > //origImp.getProcessor().setPixels(watershedImp.getProcessor().getPixels()); > if(invertedLut) { > ip.invertLut(); > } > for(int i = 0; i < ip.getWidth(); i++){ > for(int j =0; j < ip.getHeight(); j++){ > ip.putPixel(i, j, watershedImp.getProcessor().getPixel(i, j)); > } > } > /* > //prepare all unused ImagePlus, ImageProcessor and Constructors for carbage > collection > watershedImp.close(); > watershedEDM = null; > erosionImp.close(); > extractedSeparatorsImp.close(); > remainingSeparatorsImp.close(); > resultsTable = null; > pa = null; > */ > if(rttw!=null) { > IJ.renameResults("intermediateResults", "Results"); > } > } > > > public void setNPasses (int nPasses) { > this.nPasses = nPasses; > pass = 0; > } > > void showProgress(double percent) { > percent = (double)(pass-1)/nPasses + percent/nPasses; > IJ.showProgress(percent); > } > > } > > //---------------------------------- > > > > > > > > > -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html |
In reply to this post by gankaku
Hi Wayne, hi Jan,
thanks for the suggestions. I will try your suggestions. Have a nice weekend, Jan 2015-05-08 17:51 GMT+02:00 BioVoxxel <[hidden email]>: > Dear List, > > after some improvement from Thorsten Wagner on the "Watershed Irregular > Features" function of my Toolbox (thanks Thorsten) and some additional > modifications by myself, I encounter the following issue after a batch > processing test and running it on stacks. > > The watershed plugin is designed in a way that internally it is working > with a results table which works well. However, as soon as a results table > is open and contains results during batch processing it was reset after > each watershed function. > I therefore considered simply to rename the table during the watershed > process and retrieve it afterwards since I am not aware of any more elegant > solution to circumvent that problem. What is inconvenient in this approach > is that an existing results table is constantly renewed or popping up if > different values are keyed in during preview mode or after watershedding a > single slide when running it on a stack. > > This version is still not available as an update, since I first wanted to > solve this issue. Below you can find the corresponding java code for those > how want to have a look or test the described behaviour. > > I am grateful for any suggestions on more elegant solutions. > > Thanks, > Jan > > > //---------------------------------- > import ij.*; > import ij.process.*; > import ij.gui.*; > import java.awt.*; > import ij.plugin.filter.*; > import ij.measure.Measurements; > import ij.measure.ResultsTable; > import ij.text.TextWindow; > import ij.plugin.frame.PlugInFrame; > import ij.gui.DialogListener; > import ij.gui.GenericDialog; > import ij.plugin.filter.EDM; > import ij.plugin.ImageCalculator; > import ij.plugin.filter.ParticleAnalyzer; > > /** > * Watershed Irregular Features > * > * The plugin might serve to reduce artifacts created by the normal > * watershed algorithm implicated in ImageJ when applied to objects > * of irregular shape containing relatively small connections between them. > * > * Copyright (C), 2014, Jan Brocher / BioVoxxel > * > * This program is free software: you can redistribute it and/or modify > * it under the terms of the GNU General Public License as published by > * the Free Software Foundation, either version 3 of the License, or > * (at your option) any later version. > * > * This program is distributed in the hope that it will be useful, > * but WITHOUT ANY WARRANTY; without even the implied warranty of > * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > * GNU General Public License for more details. > * > * IN NO EVENT WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES > * AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR > DAMAGES, > * INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES > ARISING > * OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT > LIMITED TO > * LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY > YOU OR > * THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER > PROGRAMS), > * EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY > OF > * SUCH DAMAGES. > * > * Please cite BioVoxxel and Jan Brocher when you publish results > * obtained by usage of this plugin or a modified version of it > * > * Thank you > * > * May 04, 2015: Bug fix: Now correctly works with stacks (Thorsten > Wagner, [hidden email]) > * May 08, 2015: Bug fix: when used during batch analysis results table > were reset. This behaviour corrected > * > */ > > > public class Watershed_Irregular_Features implements ExtendedPlugInFilter, > DialogListener { > ImagePlus imp; > private double erosions = 1; > private PlugInFilterRunner pfr; > private int nPasses = 1; > private int pass; > private int flags = DOES_8G|KEEP_PREVIEW|SNAPSHOT; > > public int setup(String arg, ImagePlus imp) { > this.imp = imp; > if(!imp.getProcessor().isBinary()) { > IJ.error("works only on 8-bit binary images"); > return DONE; > } else { > return DOES_8G | DOES_STACKS; > } > } > > public int showDialog(ImagePlus imp, String command, PlugInFilterRunner > pfr) { > GenericDialog gd = new GenericDialog("Watershed Irregular Features"); > gd.addNumericField("erosion cycle number:", erosions, 1, 5, ""); > gd.addPreviewCheckbox(pfr); // passing pfr makes the > filter ready for preview > gd.addDialogListener(this); // the DialogItemChanged > method will be called on user input > gd.addHelp(" > http://fiji.sc/BioVoxxel_Toolbox#Watershed_Irregular_Structures"); > gd.showDialog(); // display the dialog; preview runs in > the background now > if (gd.wasCanceled()) { > return DONE; > } > IJ.register(this.getClass()); // protect static class > variables (filter parameters) from garbage collection > this.pfr = pfr; > return IJ.setupDialog(imp, flags); // ask whether to process all > slices of stack (if a stack) > } > > public boolean dialogItemChanged(GenericDialog gd, AWTEvent e) { > erosions = (int) gd.getNextNumber(); > if (gd.invalidNumber() || erosions<1) { > IJ.error("invalid number"); > return false; > } else { > return true; > } > } > > public void run(ImageProcessor ip) { > // ip.snapshot(); > Prefs.blackBackground = true; > TextWindow rttw = ResultsTable.getResultsWindow(); > ResultsTable rt; > if(rttw!=null) { > rt = ResultsTable.getResultsTable(); > IJ.renameResults("Results", "intermediateResults"); > } > boolean invertedLut = ip.isInvertedLut(); > if(invertedLut) { > ip.invertLut(); > } > ImagePlus origImp = new ImagePlus("",ip.duplicate()); > ImageProcessor erosionIP = ip.duplicate(); > ImagePlus erosionImp = new ImagePlus("", erosionIP); > > ImageProcessor watershedIP = ip.duplicate(); > ImagePlus watershedImp = new ImagePlus("", watershedIP); > > //dilate objects according to erosion cycle number entered by user > for(int n=0; n<=erosions; n++) { > erosionIP.dilate(); > } > > //separate original objects with the normal watershed algorithm from IJ > EDM watershedEDM = new EDM(); > watershedEDM.toWatershed(watershedIP); > > //first, the watershed separation lines are extracted > //then, the second image calculation keeps only those separators > //which overlap with an eroded particle > ImageCalculator calculateImages = new ImageCalculator(); > ImagePlus extractedSeparatorsImp = calculateImages.run("XOR create", > watershedImp, origImp); > ImagePlus remainingSeparatorsImp = calculateImages.run("AND create", > extractedSeparatorsImp, erosionImp); > > //the remaining separator lines are analyzed to get their starting position > //for later selection > int options = > ParticleAnalyzer.CLEAR_WORKSHEET|ParticleAnalyzer.RECORD_STARTS; > int measurements = Measurements.CENTROID; > ResultsTable resultsTable = new ResultsTable(); > ParticleAnalyzer pa = new ParticleAnalyzer(options, measurements, > resultsTable, 0.0, 999999999.9); > > pa.analyze(remainingSeparatorsImp); > int xStart, yStart; > > watershedIP.setValue(255.0); > //the remaining separation lines in their original size and orientation > //are copied into the watersheded image to close undesired separations > for(int r=0; r<resultsTable.getCounter(); r++) { > xStart = (int)resultsTable.getValue("XStart", r); > yStart = (int)resultsTable.getValue("YStart", r); > IJ.doWand(extractedSeparatorsImp, xStart, yStart, 0.0, "8-connected"); > Roi selectedSeparator = extractedSeparatorsImp.getRoi(); > watershedIP.fill(selectedSeparator); > } > //watershedImp.show(); > //the corrected watersheded image is copied into the original to be able to > //undo the watershed if undesired > > //origImp.getProcessor().setPixels(watershedImp.getProcessor().getPixels()); > if(invertedLut) { > ip.invertLut(); > } > for(int i = 0; i < ip.getWidth(); i++){ > for(int j =0; j < ip.getHeight(); j++){ > ip.putPixel(i, j, watershedImp.getProcessor().getPixel(i, j)); > } > } > /* > //prepare all unused ImagePlus, ImageProcessor and Constructors for > carbage collection > watershedImp.close(); > watershedEDM = null; > erosionImp.close(); > extractedSeparatorsImp.close(); > remainingSeparatorsImp.close(); > resultsTable = null; > pa = null; > */ > if(rttw!=null) { > IJ.renameResults("intermediateResults", "Results"); > } > } > > > public void setNPasses (int nPasses) { > this.nPasses = nPasses; > pass = 0; > } > > void showProgress(double percent) { > percent = (double)(pass-1)/nPasses + percent/nPasses; > IJ.showProgress(percent); > } > > } > > //---------------------------------- > > > > > > > > > > -- > > CEO: Dr. rer. nat. Jan Brocher > phone: +49 (0)6234 917 03 39 > mobile: +49 (0)176 705 746 81 > e-mail: [hidden email] > info: [hidden email] > inquiries: [hidden email] > web: www.biovoxxel.de > -- CEO: Dr. rer. nat. Jan Brocher phone: +49 (0)6234 917 03 39 mobile: +49 (0)176 705 746 81 e-mail: [hidden email] info: [hidden email] inquiries: [hidden email] web: www.biovoxxel.de -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html |
Free forum by Nabble | Edit this page |