Changeset 6581


Ignore:
Timestamp:
06/28/10 15:43:02 (9 years ago)
Author:
curtis
Message:

Preserve dimensional extents on concatenation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/loci-plugins/src/loci/plugins/in/Concatenator.java

    r6495 r6581  
    3939 * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/components/loci-plugins/src/loci/plugins/in/Concatenator.java">SVN</a></dd></dl> 
    4040 * 
     41 * @author Curtis Rueden ctrueden at wisc.edu 
    4142 * @author Melissa Linkert melissa at glencoesoftware.com 
    4243 */ 
     
    4647  public List<ImagePlus> concatenate(List<ImagePlus> imps) { 
    4748 
    48     List<Integer> widths = new ArrayList<Integer>(); 
    49     List<Integer> heights = new ArrayList<Integer>(); 
    50     List<Integer> types = new ArrayList<Integer>(); 
    51     List<ImagePlus> newImps = new ArrayList<ImagePlus>(); 
     49    // list of output (possibly concatenated) images 
     50    final List<ImagePlus> outputImps = new ArrayList<ImagePlus>(); 
    5251 
    53     for (int j=0; j<imps.size(); j++) { 
    54       ImagePlus imp = imps.get(j); 
    55       int wj = imp.getWidth(); 
    56       int hj = imp.getHeight(); 
    57       int tj = imp.getBitDepth(); 
     52    for (ImagePlus imp : imps) { 
     53      final int width = imp.getWidth(); 
     54      final int height = imp.getHeight(); 
     55      final int type = imp.getType(); 
     56      final int cSize = imp.getNChannels(); 
     57      final int zSize = imp.getNSlices(); 
     58      final int tSize = imp.getNFrames(); 
     59 
    5860      boolean append = false; 
    59       for (int k=0; k<widths.size(); k++) { 
    60         int wk = widths.get(k); 
    61         int hk = heights.get(k); 
    62         int tk = types.get(k); 
     61      for (int k=0; k<outputImps.size(); k++) { 
     62        final ImagePlus outputImp = outputImps.get(k); 
     63        final int w = outputImp.getWidth(); 
     64        final int h = outputImp.getHeight(); 
     65        final int outType = outputImp.getType(); 
     66        final int c = outputImp.getNChannels(); 
     67        final int z = outputImp.getNSlices(); 
     68        final int t = outputImp.getNFrames(); 
    6369 
    64         if (wj == wk && hj == hk && tj == tk) { 
    65           ImagePlus oldImp = newImps.get(k); 
    66           ImageStack is = oldImp.getStack(); 
    67           ImageStack newStack = imp.getStack(); 
    68           for (int s=0; s<newStack.getSize(); s++) { 
    69             is.addSlice(newStack.getSliceLabel(s + 1), 
    70               newStack.getProcessor(s + 1)); 
    71           } 
    72           oldImp.setStack(oldImp.getTitle(), is); 
    73           newImps.set(k, oldImp); 
    74           append = true; 
    75           k = widths.size(); 
     70        // verify that images are compatible 
     71        if (width != w || height != h) continue; // different XY resolution 
     72        if (type != outType) continue; // different processor type 
     73        final boolean canAppendT = cSize == c && zSize == z; 
     74        final boolean canAppendZ = cSize == c && tSize == t; 
     75        final boolean canAppendC = zSize == z && tSize == t; 
     76        if (!canAppendT && !canAppendZ && !canAppendC) { 
     77          // incompatible dimensions 
     78          continue; 
    7679        } 
     80 
     81        // concatenate planes onto this output image 
     82        final ImageStack outputStack = outputImp.getStack(); 
     83        final ImageStack inputStack = imp.getStack(); 
     84        for (int s=0; s<inputStack.getSize(); s++) { 
     85          outputStack.addSlice(inputStack.getSliceLabel(s + 1), 
     86            inputStack.getProcessor(s + 1)); 
     87        } 
     88        outputImp.setStack(outputImp.getTitle(), outputStack); 
     89 
     90        // update image dimensions 
     91        // NB: For now, we prioritize adding to the time points, then 
     92        // focal planes, and lastly channels. In some cases, there may be 
     93        // multiple compatible dimensions; in the future, we may prompt the 
     94        // user to choose the axis for concatenation. 
     95        if (canAppendT) outputImp.setDimensions(c, z, t + tSize); 
     96        else if (canAppendZ) outputImp.setDimensions(c, z + zSize, t); 
     97        else if (canAppendC) outputImp.setDimensions(c + cSize, z, t); 
     98        else throw new IllegalStateException("Dimensional mismatch"); 
     99 
     100        append = true; 
     101        break;         
    77102      } 
    78103      if (!append) { 
    79         widths.add(new Integer(wj)); 
    80         heights.add(new Integer(hj)); 
    81         types.add(new Integer(tj)); 
    82         newImps.add(imp); 
     104        // could not concatenate input image to any existing output; 
     105        // append it to the list of outputs directly instead 
     106        outputImps.add(imp); 
    83107      } 
    84108    } 
    85109 
    86     return newImps; 
     110    return outputImps; 
    87111  } 
    88112 
Note: See TracChangeset for help on using the changeset viewer.