public static ColorDeconvolutionStains parseColorDeconvolutionStainsArg(final String s) { Map<String, String> map = GeneralTools.parseArgStringValues(s); if (map.isEmpty()) return null; StainVector stain1 = parseStainVector(Locale.US, map.get("Stain 1"), map.get("Values 1")); StainVector stain2 = parseStainVector(Locale.US, map.get("Stain 2"), map.get("Values 2")); StainVector stain3 = null; if (map.containsKey("Stain 3")) stain3 = parseStainVector(Locale.US, map.get("Stain 3"), map.get("Values 3")); double[] background = parseStainValues(Locale.US, map.get("Background")); return new ColorDeconvolutionStains(map.get("Name"), stain1, stain2, stain3, background[0], background[1], background[2]); }
/** * Create a ColorDeconvolutionStains for a default stain combination, and default max values (255 for all channels). * * @param stains * @return */ public static ColorDeconvolutionStains makeDefaultColorDeconvolutionStains(DEFAULT_CD_STAINS stains) { switch(stains) { case H_E: return new ColorDeconvolutionStains("H&E default", StainVector.makeDefaultStainVector(StainVector.DEFAULT_STAINS.HEMATOXYLIN), StainVector.makeDefaultStainVector(StainVector.DEFAULT_STAINS.EOSIN)); case H_DAB: return new ColorDeconvolutionStains("H-DAB default", StainVector.makeDefaultStainVector(StainVector.DEFAULT_STAINS.HEMATOXYLIN), StainVector.makeDefaultStainVector(StainVector.DEFAULT_STAINS.DAB)); } return null; }
/** * Create a new stains object with the same StainVectors but new max (background) values. * * @param maxRed * @param maxGreen * @param maxBlue * @return */ public ColorDeconvolutionStains changeMaxValues(double maxRed, double maxGreen, double maxBlue) { return new ColorDeconvolutionStains(getName(), getStain(1), getStain(2), getStain(3), maxRed, maxGreen, maxBlue); }
/** * Create a new stains object with the same StainVectors but a new name. * * @param name * @return */ public ColorDeconvolutionStains changeName(String name) { return new ColorDeconvolutionStains(name, getStain(1), getStain(2), getStain(3), getMaxRed(), getMaxGreen(), getMaxBlue()); }
/** * Create a new ColorDeconvolutionStains object, with all settings the same except one of the stains has been changed. * If the third stain was a residual, it will also be regenerated (i.e. it won't remain the same residual... which would be wrong, * as it would be orthogonal to the old stain rather than the new one). * * @param stains * @param stain * @param stainNumber * @return */ public static ColorDeconvolutionStains makeModifiedStains(ColorDeconvolutionStains stains, StainVector stainNew, int stainNumber) { StainVector[] stainVectors = new StainVector[3]; stainVectors[0] = stains.getStain(1); stainVectors[1] = stains.getStain(2); stainVectors[2] = stains.getStain(3); stainVectors[stainNumber - 1] = stainNew; if (stainVectors[2].isResidual()) stainVectors[2] = null; return new ColorDeconvolutionStains(stains.getName(), stainVectors[0], stainVectors[1], stainVectors[2], stains.getMaxRed(), stains.getMaxGreen(), stains.getMaxBlue()); }
return new ColorDeconvolutionStains(stains.getName(), stain1Refined, stain2Refined, whiteValues[0], whiteValues[1], whiteValues[2]);
ColorDeconvolutionStains stains = new ColorDeconvolutionStains(stainsOriginal.getName(), s1, s2, stainsOriginal.getMaxRed(), stainsOriginal.getMaxGreen(), stainsOriginal.getMaxBlue());