public static IndexColorModel getIndexColorModel(final StainVector stain, boolean whiteBackground) { if (!whiteBackground) return createIndexColorModel(new Color(stain.getColor())); double r = stain.getRed(); double g = stain.getGreen(); double b = stain.getBlue(); byte[] r2 = new byte[256]; byte[] g2 = new byte[256]; byte[] b2 = new byte[256]; for (int i = 0; i < 256; i++) { r2[i] = (byte)StainVector.clip255(255.0 - r * i); g2[i] = (byte)StainVector.clip255(255.0 - g * i); b2[i] = (byte)StainVector.clip255(255.0 - b * i); // r2[i] = (byte)clip255(Math.exp(-r) * (255 - i)); // g2[i] = (byte)clip255(Math.exp(-g) * (255 - i)); // b2[i] = (byte)clip255(Math.exp(-b) * (255 - i)); } return new IndexColorModel(8, 256, r2, g2, b2); }
public static StainVector makeOrthogonalStainVector(String name, StainVector s1, StainVector s2, boolean isResidual) { return new StainVector(name, cross3(s1.getArray(), s2.getArray()), isResidual); }
/** * Check if the name of a StainVector is "eosin", "eos" or "e" (ignoring case) * * @param stain * @return */ public static boolean isEosin(final StainVector stain) { String name = stain.getName(); if (name == null) return false; name = name.toLowerCase().trim(); for (String s : EOSIN_SPELLINGS) { if (s.equals(name)) return true; } return false; }
public static StainVector parseStainVector(Locale locale, String name, String s) { if (s == null) return null; s = s.trim(); if (s.length() == 0) return null; if (s.length() == 1) { s = s.toLowerCase(); if (s.equals("h")) return StainVector.makeDefaultStainVector(DEFAULT_STAINS.HEMATOXYLIN); else if (s.equals("e")) return StainVector.makeDefaultStainVector(DEFAULT_STAINS.EOSIN); else if (s.equals("d")) return StainVector.makeDefaultStainVector(DEFAULT_STAINS.DAB); } double[] vector = parseStainValues(locale, s); if (vector != null) return new StainVector(name, vector[0], vector[1], vector[2]); // If we got here, we didn't find 3 numbers return null; }
double[] stain1 = stains.getStain(1).getArray(); double[] stain2 = stains.getStain(2).getArray(); float[] stain1Proj = new float[nnz]; float[] stain2Proj = new float[nnz]; StainVector stainBase1 = new StainVector("Basis 1", r1Sum/n1, g1Sum/n1, b1Sum/n1); StainVector stainBase2 = new StainVector("Basis 2", r2Sum/n2, g2Sum/n2, b2Sum/n2); stainBase1 = new StainVector("Basis 1", (stainBase1.getRed() + stainBase2.getRed())/2, (stainBase1.getGreen() + stainBase2.getGreen())/2, (stainBase1.getBlue() + stainBase2.getBlue())/2); StainVector stainNorm = StainVector.makeResidualStainVector(stainBase1, stainBase2); stainBase2 = StainVector.makeOrthogonalStainVector("Basis 2", stainBase1, stainNorm, false); double[] base1 = stainBase1.getArray(); double[] base2 = stainBase2.getArray(); double[] angles = new double[nnz]; StainVector stain2Refined = new StainVector(stains.getStain(2).getName(), base1[0]*cos + base2[0]*sin, base1[1]*cos + base2[1]*sin, base1[2]*cos + base2[2]*sin); cos = Math.cos(maxAngle); sin = Math.sin(maxAngle); StainVector stain1Refined = new StainVector(stains.getStain(1).getName(), base1[0]*cos + base2[0]*sin, base1[1]*cos + base2[1]*sin, base1[2]*cos + base2[2]*sin);
StainVector s1 = new StainVector(stainsOriginal.getStain(1).getName(), red[ind1], green[ind1], blue[ind1]); StainVector s2 = new StainVector(stainsOriginal.getStain(2).getName(), red[ind2], green[ind2], blue[ind2]); if (s1.getRed() < s2.getRed()) { s1 = new StainVector(stainsOriginal.getStain(1).getName(), red[ind2], green[ind2], blue[ind2]); s2 = new StainVector(stainsOriginal.getStain(2).getName(), red[ind1], green[ind1], blue[ind1]); double angle11 = StainVector.computeAngle(s1, stainsOriginal.getStain(1)); double angle12 = StainVector.computeAngle(s1, stainsOriginal.getStain(2)); double angle21 = StainVector.computeAngle(s2, stainsOriginal.getStain(1)); double angle22 = StainVector.computeAngle(s2, stainsOriginal.getStain(2)); if (Math.min(angle12, angle21) < Math.min(angle11, angle22)) { s1 = new StainVector(stainsOriginal.getStain(1).getName(), red[ind2], green[ind2], blue[ind2]); s2 = new StainVector(stainsOriginal.getStain(2).getName(), red[ind1], green[ind1], blue[ind1]);
double s22 = matInv[2][2]; discardResidual = discardResidual && stainsInput.getStain(3).isResidual(); double d00 = stainsOutput.getStain(1).getRed(); double d01 = stainsOutput.getStain(1).getGreen(); double d02 = stainsOutput.getStain(1).getBlue(); double d10 = stainsOutput.getStain(2).getRed(); double d11 = stainsOutput.getStain(2).getGreen(); double d12 = stainsOutput.getStain(2).getBlue(); double d20 = stainsOutput.getStain(3).getRed(); double d21 = stainsOutput.getStain(3).getGreen(); double d22 = stainsOutput.getStain(3).getBlue();
double rStain = stains.getStain(1).getRed(); double gStain = stains.getStain(1).getGreen(); double bStain = stains.getStain(1).getBlue(); od_lut_red = ColorDeconvolutionHelper.makeODLUT(stains.getMaxRed()); od_lut_green = ColorDeconvolutionHelper.makeODLUT(stains.getMaxGreen()); rStain = stains.getStain(2).getRed(); gStain = stains.getStain(2).getGreen(); bStain = stains.getStain(2).getBlue(); od_lut_red = ColorDeconvolutionHelper.makeODLUT(stains.getMaxRed()); od_lut_green = ColorDeconvolutionHelper.makeODLUT(stains.getMaxGreen()); rStain = stains.getStain(3).getRed(); gStain = stains.getStain(3).getGreen(); bStain = stains.getStain(3).getBlue(); od_lut_red = ColorDeconvolutionHelper.makeODLUT(stains.getMaxRed()); od_lut_green = ColorDeconvolutionHelper.makeODLUT(stains.getMaxGreen()); rStain = stains.getStain(1).getRed(); gStain = stains.getStain(1).getGreen(); bStain = stains.getStain(1).getBlue(); od_lut_red = ColorDeconvolutionHelper.makeODLUT(stains.getMaxRed()); od_lut_green = ColorDeconvolutionHelper.makeODLUT(stains.getMaxGreen()); rStain = stains.getStain(2).getRed(); gStain = stains.getStain(2).getGreen(); bStain = stains.getStain(2).getBlue(); od_lut_red = ColorDeconvolutionHelper.makeODLUT(stains.getMaxRed()); od_lut_green = ColorDeconvolutionHelper.makeODLUT(stains.getMaxGreen());
public static String getColorDeconvolutionStainsAsString(final ColorDeconvolutionStains stains, final int nDecimalPlaces) { if (stains == null) return ""; StringBuilder sb = new StringBuilder(); sb.append("{"); sb.append("\"Name").append("\" : \"").append(stains.getName()).append("\", "); for (int i = 1; i <= 3; i++) { StainVector stain = stains.getStain(i); // No need to add the residual stain if (i == 3 && stain.isResidual()) continue; sb.append("\"Stain ").append(i).append("\" : \"").append(stain.getName()).append("\", "); sb.append("\"Values ").append(i).append("\" : \"").append(stain.arrayAsString(Locale.US, nDecimalPlaces)).append("\", "); } sb.append("\"Background\" : \""); sb.append(" ").append(GeneralTools.arrayToString(Locale.US, new double[]{stains.getMaxRed(), stains.getMaxGreen(), stains.getMaxBlue()}, nDecimalPlaces)); // sb.append(String.format( "%.Nf %.Nf %.Nf".replace("N", Integer.toString(nDecimalPlaces)), stains.getMaxRed(), stains.getMaxGreen(), stains.getMaxBlue())); // sb.append(stains.getMaxRed()).append(" "); // sb.append(stains.getMaxGreen()).append(" "); // sb.append(stains.getMaxBlue()); sb.append("\"}"); return sb.toString(); }
public static StainVector makeDefaultStainVector(DEFAULT_STAINS stain) { switch(stain) { case HEMATOXYLIN: return new StainVector(stain.toString(), STAIN_HEMATOXYLIN_DEFAULT); case EOSIN: return new StainVector(stain.toString(), STAIN_EOSIN_DEFAULT); case DAB: return new StainVector(stain.toString(), STAIN_DAB_DEFAULT); } return null; }
/** * Get a Color that (roughly) corresponds to color represented by this stain vector. * It may be used to create a color lookup table. * * @return */ public int getColor() { int r2 = clip255(255.0 - r * 255); int g2 = clip255(255.0 - g * 255); int b2 = clip255(255.0 - b * 255); return ColorTools.makeRGB(r2, g2, b2); }
public final void ensureStainsUpdated() { if (imageDisplay == null || imageDisplay.getImageData() == null) { stains = null; return; } stains = imageDisplay.getImageData().getColorDeconvolutionStains(); if (stainNumber < 0) { color = ColorTools.makeRGB(255, 255, 255); colorModel = ColorTransformerAWT.getDefaultColorModel(method); } else { color = stains.getStain(stainNumber).getColor(); colorModel = ColorToolsAwt.getIndexColorModel(stains.getStain(stainNumber)); } }
public String arrayAsString(final Locale locale) { return arrayAsString(locale, 3); }
double b = blue[medianInd]; return new StainVector(name, r, g, b);
public static IndexColorModel createIndexColorModel(Color color, boolean whiteBackground) { if (!whiteBackground) return ColorToolsAwt.createIndexColorModel(color); byte[] rLut = new byte[256]; byte[] gLut = new byte[256]; byte[] bLut = new byte[256]; int red = color.getRed(); int green = color.getGreen(); int blue = color.getBlue(); double len = Math.sqrt(red*red + green*green + blue*blue); double rIncr = 1-((double)red)/len; double gIncr = 1-((double)green)/len; double bIncr = 1-((double)blue)/len; for (int i=0; i<256; ++i) { rLut[i] = (byte)StainVector.clip255(255 - i*rIncr); gLut[i] = (byte)StainVector.clip255(255 - i*gIncr); bLut[i] = (byte)StainVector.clip255(255 - i*bIncr); } return new IndexColorModel(8, 256, rLut, gLut, bLut); }
@Override public String toString() { return name + ": " + arrayAsString(Locale.getDefault(Category.FORMAT)); }
/** * Check if the name of a StainVector is "dab" or "d" (ignoring case) * * @param stain * @return */ public static boolean isDAB(final StainVector stain) { String name = stain.getName(); if (name == null) return false; name = name.toLowerCase().trim(); for (String s : DAB_SPELLINGS) { if (s.equals(name)) return true; } return false; }
public static StainVector generateStainVectorFromRGB(String name, int rgb, double redMax, double greenMax, double blueMax) { double rOD = makeOD(ColorTools.red(rgb), redMax); double gOD = makeOD(ColorTools.green(rgb), greenMax); //J double bOD = makeOD(ColorTools.blue(rgb), blueMax); //J return new StainVector(name, rOD, gOD, bOD); }
/** * Check if the name of a StainVector is "haematoxylin", "hematoxylin", "haem" or "h" (ignoring case) * * @param stain * @return */ public static boolean isHematoxylin(final StainVector stain) { String name = stain.getName(); if (name == null) return false; name = name.toLowerCase().trim(); for (String s : HEMATOXYLIN_SPELLINGS) { if (s.equals(name)) return true; } return false; }
public String getName(final ColorDeconvolutionStains stains) { switch (this) { case STAIN_1: return stains == null ? "Stain 1" : stains.getStain(1).getName(); case STAIN_2: return stains == null ? "Stain 2" : stains.getStain(2).getName(); case STAIN_3: return stains == null ? "Stain 3" : stains.getStain(3).getName(); case HUE: return "Hue"; case OD: return "OD Sum"; default: return getPrompt(null); } }