Changeset 6736


Ignore:
Timestamp:
07/27/10 14:50:05 (9 years ago)
Author:
curtis
Message:

More speed improvements and other cleanup to bfopen.m.

Location:
trunk/components
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/utils/bfopen.m

    r6731 r6736  
    1313 
    1414This method is ~1.5x-2.5x slower than Bio-Formats's command line showinf 
    15 tool (MATLAB R14 vs. java 1.6.0_03), due to overhead from reshaping arrays 
    16 and converting pixel types. 
     15tool (MATLAB R14 vs. java 1.6.0_20), due to overhead from copying arrays. 
    1716 
    1817Thanks to all who offered suggestions and improvements: 
     
    2221    * Tony Collins 
    2322    * Cris Luengo 
     23    * Arnon Liber 
    2424 
    2525Internet Explorer sometimes erroneously renames the Bio-Formats library 
     
    5555    fprintf('Reading series #%d', s); 
    5656    r.setSeries(s - 1); 
    57     w = r.getSizeX(); 
    58     h = r.getSizeY(); 
    59     shape = [w h]; 
     57    width = r.getSizeX(); 
     58    height = r.getSizeY(); 
    6059    pixelType = r.getPixelType(); 
    6160    bpp = loci.formats.FormatTools.getBytesPerPixel(pixelType); 
     
    7069 
    7170        % retrieve color map data 
    72         nBytes = loci.formats.FormatTools.getBytesPerPixel(r.getPixelType()); 
    73         if nBytes == 1 
    74           colorMaps{s, i} = r.get8BitLookupTable()'; 
     71        if bpp == 1 
     72            colorMaps{s, i} = r.get8BitLookupTable()'; 
    7573        else 
    76           colorMaps{s, i} = r.get16BitLookupTable()'; 
     74            colorMaps{s, i} = r.get16BitLookupTable()'; 
    7775        end 
    78  
    79         newMap = zeros(size(colorMaps{s, i}, 1), size(colorMaps{s, i}, 2)); 
    80         for (row = 1:size(colorMaps{s, i}, 1)) 
    81            for (col = 1:size(colorMaps{s, i}, 2)) 
    82               newMap(row, col) = colorMaps{s, i}(row, col); 
    83               if newMap(row, col) < 0 
    84                   newMap(row, col) = newMap(row, col) + power(2, nBytes * 8); 
    85               end 
    86               newMap(row, col) = newMap(row, col) / (power(2, nBytes * 8) - 1); 
    87            end 
     76        rowCount = size(colorMaps{s, i}, 1); 
     77        colCount = size(colorMaps{s, i}, 2); 
     78        newMap = zeros(rowCount, colCount); 
     79        for (row = 1:rowCount) 
     80            for (col = 1:colCount) 
     81                newMap(row, col) = colorMaps{s, i}(row, col); 
     82                pow = power(2, bpp * 8); 
     83                if newMap(row, col) < 0 
     84                    newMap(row, col) = newMap(row, col) + pow; 
     85                end 
     86                newMap(row, col) = newMap(row, col) / (pow - 1); 
     87            end 
    8888        end 
    8989        colorMaps{s, i} = newMap; 
    9090 
    9191        % convert byte array to MATLAB image 
    92         pix = loci.common.DataTools.makeDataArray(plane, bpp, fp, little); 
    93         arr = reshape(pix, shape)'; 
     92        arr = loci.common.DataTools.makeDataArray2D(plane, ... 
     93            bpp, fp, little, height); 
     94        % if using Bio-Formats 4.2 stable rather than trunk, 
     95        % use the following commands instead of the above line 
     96        %pix = loci.common.DataTools.makeDataArray(plane, bpp, fp, little); 
     97        %shape = [width height]; 
     98        %arr = reshape(pix, shape)'; 
     99 
    94100        % build an informative title for our figure 
    95101        label = id; 
     
    127133            end 
    128134        end 
     135 
    129136        % save image plane and label into the list 
    130137        imageList{i, 1} = arr; 
    131138        imageList{i, 2} = label; 
    132139    end 
     140 
    133141    % extract metadata table for this series 
    134142    metadataList = r.getMetadata(); 
     143 
    135144    % save images and metadata into our master series list 
    136145    result{s, 1} = imageList; 
     
    168177figure('Name', series1_label1); 
    169178if isempty(series1_colorMaps{1}) 
    170   colormap(gray); 
     179    colormap(gray); 
    171180else 
    172   colormap(series1_colorMaps{1}); 
     181    colormap(series1_colorMaps{1}); 
    173182end 
    174183imagesc(series1_plane1); 
  • trunk/components/common/src/loci/common/DataTools.java

    r6495 r6736  
    487487 
    488488  /** @deprecated Use {@link #unpackBytes(long, byte[], int, int, boolean) */ 
     489  @Deprecated 
    489490  public static void unpackShort(short value, byte[] buf, int ndx, 
    490491    boolean little) 
     
    520521 
    521522  /** 
    522    * Convert a byte array to the appropriate primitive type array. 
     523   * Convert a byte array to the appropriate 1D primitive type array. 
     524   * 
    523525   * @param b Byte array to convert. 
    524526   * @param bpp Denotes the number of bytes in the returned primitive type 
     
    527529   * @param little Whether byte array is in little-endian order. 
    528530   */ 
    529   public static Object makeDataArray(byte[] b, int bpp, boolean fp, 
    530     boolean little) 
     531  public static Object makeDataArray(byte[] b, 
     532    int bpp, boolean fp, boolean little) 
    531533  { 
    532534    if (bpp == 1) { 
     
    576578   *   regardless of signedness. 
    577579   */ 
     580  @Deprecated 
    578581  public static Object makeDataArray(byte[] b, 
    579582    int bpp, boolean fp, boolean little, boolean signed) 
    580583  { 
    581584    return makeDataArray(b, bpp, fp, little); 
     585  } 
     586 
     587  /** 
     588   * Convert a byte array to the appropriate 2D primitive type array. 
     589   * 
     590   * @param b Byte array to convert. 
     591   * @param bpp Denotes the number of bytes in the returned primitive type 
     592   *   (e.g. if bpp == 2, we should return an array of type short). 
     593   * @param fp If set and bpp == 4 or bpp == 8, then return floats or doubles. 
     594   * @param little Whether byte array is in little-endian order. 
     595   * @param height The height of the output primitive array (2nd dim length). 
     596   * 
     597   * @return a 2D primitive array of appropriate type, 
     598   *   dimensioned [height][b.length / (bpp * height)] 
     599   * 
     600   * @throws IllegalArgumentException if input byte array does not divide 
     601   *   evenly into height pieces 
     602   */ 
     603  public static Object makeDataArray2D(byte[] b, 
     604    int bpp, boolean fp, boolean little, int height) 
     605  { 
     606    if (b.length % (bpp * height) != 0) { 
     607      throw new IllegalArgumentException("Array length mismatch: " + 
     608        "b.length=" + b.length + "; bpp=" + bpp + "; height=" + height); 
     609    } 
     610    final int width = b.length / (bpp * height); 
     611    if (bpp == 1) { 
     612      byte[][] b2 = new byte[height][width]; 
     613      for (int y=0; y<height; y++) { 
     614        int index = width*y; 
     615        System.arraycopy(b, index, b2[y], 0, width); 
     616      } 
     617      return b2; 
     618    } 
     619    else if (bpp == 2) { 
     620      short[][] s = new short[width][height]; 
     621      for (int y=0; y<height; y++) { 
     622        for (int x=0; x<width; x++) { 
     623          int index = 2*(width*y + x); 
     624          s[y][x] = bytesToShort(b, index, 2, little); 
     625        } 
     626      } 
     627      return s; 
     628    } 
     629    else if (bpp == 4 && fp) { 
     630      float[][] f = new float[width][height]; 
     631      for (int y=0; y<height; y++) { 
     632        for (int x=0; x<width; x++) { 
     633          int index = 4*(width*y + x); 
     634          f[y][x] = bytesToFloat(b, index, 4, little); 
     635        } 
     636      } 
     637      return f; 
     638    } 
     639    else if (bpp == 4) { 
     640      int[][] i = new int[width][height]; 
     641      for (int y=0; y<height; y++) { 
     642        for (int x=0; x<width; x++) { 
     643          int index = 4*(width*y + x); 
     644          i[y][x] = bytesToInt(b, index, 4, little); 
     645        } 
     646      } 
     647      return i; 
     648    } 
     649    else if (bpp == 8 && fp) { 
     650      double[][] d = new double[width][height]; 
     651      for (int y=0; y<height; y++) { 
     652        for (int x=0; x<width; x++) { 
     653          int index = 8*(width*y + x); 
     654          d[y][x] = bytesToDouble(b, index, 8, little); 
     655        } 
     656      } 
     657      return d; 
     658    } 
     659    else if (bpp == 8) { 
     660      long[][] l = new long[width][height]; 
     661      for (int y=0; y<height; y++) { 
     662        for (int x=0; x<width; x++) { 
     663          int index = 8*(width*y + x); 
     664          l[y][x] = bytesToLong(b, index, 8, little); 
     665        } 
     666      } 
     667      return l; 
     668    } 
     669    return null; 
    582670  } 
    583671 
Note: See TracChangeset for help on using the changeset viewer.