Login  Register

Re: sorting a stack

Posted by dscho on Aug 12, 2013; 6:37pm
URL: http://imagej.273.s1.nabble.com/sorting-a-stack-tp5004395p5004401.html

Hi Ken,

On Mon, 12 Aug 2013, Kenneth Sloan wrote:

> I would like a bit of help writing a utility Java plug-in.  
>
> Given a stack of images, with names of the form abcKEYxyz, I want to
> sort on "KEY".  So, for example, I could define:
>
> static int compareOnKey(<slice>a, <slice>b)
> {
>  return extractKey(a).compareTo(extractKey(b));
> }
>
> Where "extractKey" produces a String (for example, part of the filename).
>
> Then, I need:
>
> static void exchange(<slice>a, <slice>b)
>
> What I need help on is the details of:
>
> a) what's the data type for a "<slice>"?
> b) how do I get the name of a <slice>?
> c) how do I "exchange" two slices in the stack?
>
> The sort is no problem (I'll probably use InsertionSort).  The details
> of compareOnKey may vary (I may write several such StackSorters, or I
> might (eventually) write one with a dialog box for options.

Don't use InsertionSort. The Java API offers much better (and more
convenient) sorting options.

> The idea is to order the stack of images according to various criteria
> which can be derived from the filename associated with each image.  In
> particular, we have an age-series of images, where the age appears in a
> fixed location in the filename.  I'd like to sort the stack by age, and
> then make a montage.
>
> I'll go off and dive into the API now - but I suspect that someone has
> this knowledge "off the top of their head".  All clues gratefully
> rented.
>
> The perfect reply would be the guts of a plugin that sorts on filename
> (keeping in mind that I will have to modify it by altering
> "extractKey()")

Sorry, you will have to write it yourself. But here are a couple of hints:

- You should first make an array of Integers and populate it with the
  indices 1..<stackSize>

- Make this array final so that you can use it in an anonymous instance of
  the comparator class:

        // assuming that stack is the instance of the ImageStack
        final Integer[] array = stack.getSize();
        ...

        java.util.Arrays.sort(array, new Comparator<Integer>() {
                @Override
                public int compare(Integer a, Integer b) {
                        final int indexA = a.intValue();
                        final int indexB = b.intValue();
                        final String labelA = stack.getSliceLabel(indexA);
                        final String labelB = stack.getSliceLabel(indexB);
                        final ImageProcessor ipA = stack.getProcessor(indexA);
                        final ImageProcessor ipB = stack.getProcessor(indexB);
                        // return negative if a is "smaller than" b,
                        // positive if it is "larger", 0 if it is
                        // equivalent
                }
        });

- The construct a new ImageStack and add the slices of the old one with
  the order given by the array

Good luck,
Johannes

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html