예제 #1
0
  // analogous to getConvertedWBS4OME_JPEG in OMEimage.js
  // and boundary conditions modifier in updatePic in OMEimage.js
  public ChannelBlackScaleData getNormalizedScale(int t) {
    if (t < 0 || t >= getDimT()) {
      return null;
    }

    Integer tObj = new Integer(t);
    if (cbsMap.containsKey(tObj)) {
      return (ChannelBlackScaleData) cbsMap.get(tObj);
    }

    ChannelBlackScaleData convertedData = new ChannelBlackScaleData();

    ChannelBlackScaleData.CBSChunk[] dataChunks = {
      CBS.getCBSChunk(ChannelBlackScaleData.RED_CHUNK),
      CBS.getCBSChunk(ChannelBlackScaleData.GREEN_CHUNK),
      CBS.getCBSChunk(ChannelBlackScaleData.BLUE_CHUNK),
      CBS.getCBSChunk(ChannelBlackScaleData.GRAY_CHUNK)
    };

    ChannelBlackScaleData.CBSChunk[] newChunks =
        new ChannelBlackScaleData.CBSChunk[dataChunks.length];

    for (int i = 0; i < dataChunks.length; i++) {
      ChannelBlackScaleData.CBSChunk chunk = dataChunks[i];
      int channel = chunk.getChannel();
      int blackLevel = chunk.getBlackLevel();
      float scale = chunk.getScale();

      float newBlack = getStackGeoMean(channel, t) + getStackGeoSigma(channel, t) * blackLevel;

      float scaleMod = scale == 0f ? 0.00001f : scale;
      float newScale = 255f / (getStackGeoSigma(channel, t) * scaleMod);

      int newB = Math.round(newBlack);
      float newS = Math.round(newScale * 100000f) / 100000f;

      // black-level overcorrection adjustment
      if (newB < getStackMin(channel, t)) {
        newB = Math.round((float) Math.ceil(getStackMin(channel, t)));
      }

      if (newB > getStackMax(channel, t)) {
        newB = Math.round((float) Math.floor(getStackMax(channel, t)));
      }
      // end black-level overcorrection adjustment

      // white-level overcorrection adjustment
      float whiteLevel =
          getStackGeoMean(channel, t) + dataChunks[i].getScale() * getStackGeoSigma(channel, t);
      boolean recalculate = false;

      if (whiteLevel < getStackMin(channel, t)) {
        whiteLevel = getStackMin(channel, t);
        recalculate = true;
      }
      if (whiteLevel > getStackMax(channel, t)) {
        whiteLevel = getStackMax(channel, t);
        recalculate = true;
      }

      if (recalculate) {
        if (whiteLevel - getStackGeoMean(channel, t) == 0f) {
          whiteLevel += 0.00001f;
        }
        newS = 255f / (whiteLevel - getStackGeoMean(channel, t));
      }
      // end white-level correction adjustment

      newChunks[i] = new ChannelBlackScaleData.CBSChunk(channel, newB, newS);
    }

    convertedData.setCBSChunk(ChannelBlackScaleData.RED_CHUNK, newChunks[0]);
    convertedData.setCBSChunk(ChannelBlackScaleData.GREEN_CHUNK, newChunks[1]);
    convertedData.setCBSChunk(ChannelBlackScaleData.BLUE_CHUNK, newChunks[2]);
    convertedData.setCBSChunk(ChannelBlackScaleData.RED_CHUNK, newChunks[3]);

    cbsMap.put(tObj, convertedData);
    return convertedData;
  }