// 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; }