int serverWidth = server.getWidth(); int serverHeight = server.getHeight(); if (x < 0 || y < 0 || x >= serverWidth || y >= serverHeight) return null; double downsamplePreferred = server.getPreferredDownsampleFactor(downsampleFactor); int tileWidth = server.getPreferredTileWidth(); int tileHeight = server.getPreferredTileHeight(); if (tileWidth < 0) tileWidth = 256; int yy = (int)(y / tileHeightForLevel) * tileHeightForLevel; RegionRequest request = RegionRequest.createInstance(server.getPath(), downsamplePreferred, xx, yy, (int)Math.min(serverWidth, (xx+tileWidthForLevel))-xx, (int)Math.min(serverHeight, (yy+tileHeightForLevel))-yy, zPosition, tPosition); return request;
/** * Calculate a downsample factor for a server given a preferred pixel size. * * Optionally ensure that the downsample is a power of 2 (i.e. the closest power of 2 available to the 'ideal' downsample). * * @param server * @param preferredPixelSizeMicrons * @param doLog2 * @return */ public static double getDownsampleFactor(final ImageServer<?> server, final double preferredPixelSizeMicrons, boolean doLog2) { if (server == null) return Double.NaN; double downsampleFactor = getPreferredDownsampleForPixelSizeMicrons(server.getAveragedPixelSizeMicrons(), preferredPixelSizeMicrons, doLog2); if (Double.isNaN(downsampleFactor) || downsampleFactor < 1) downsampleFactor = 1; return downsampleFactor; }
public static <T> ImmutableDimension getPreferredTileSizePixels(final ParameterList params, final ImageServer<T> server) { // Determine tile size int tileWidth, tileHeight; if (server.hasPixelSizeMicrons()) { double tileSize = params.getDoubleParameterValue("tileSizeMicrons"); tileWidth = (int)(tileSize / server.getPixelWidthMicrons() + .5); tileHeight = (int)(tileSize / server.getPixelHeightMicrons() + .5); } else { tileWidth = (int)(params.getDoubleParameterValue("tileSizePx") + .5); tileHeight = tileWidth; } return new ImmutableDimension(tileWidth, tileHeight); }
@Override public boolean suportsImageType(ImageServer<BufferedImage> server) { return server.isRGB() || (server.nChannels() == 1 && server.getBitsPerPixel() == 8); }
RegionRequest getThumbnailRequest(final ImageServer<T> server, final int zPosition, final int tPosition) { // Determine thumbnail size double downsample; if (isTiledImageServer(server)) { downsample = (double)server.getWidth() / thumbnailWidth; } else { downsample = 1; } // Ensure we aren't accidentally upsampling (shouldn't actually happen) downsample = Math.max(downsample, 1); return RegionRequest.createInstance(server.getPath(), downsample, 0, 0, server.getWidth(), server.getHeight(), zPosition, tPosition); }
if (server.hasPixelSizeMicrons()) { downsample = params.getDoubleParameterValue("pixelSizeMicrons") / server.getAveragedPixelSizeMicrons(); } else downsample = params.getDoubleParameterValue("downsample"); region = RegionRequest.createInstance(server.getPath(), downsample, pathROI); } else { ImmutableDimension size = getPreferredTileSizePixels(server, params); int width = Math.min(server.getWidth(), xStart + size.width) - xStart; int height = Math.min(server.getHeight(), yStart + size.height) - yStart; region = RegionRequest.createInstance(server.getPath(), downsample, xStart, yStart, width, height, pathROI.getT(), pathROI.getZ()); img = server.readBufferedImage(region); boolean isRGB = server.isRGB(); int w = img.getWidth(); int h = img.getHeight();
boolean hasMagnification = !Double.isNaN(server.getMagnification()); if (hasMagnification) downsample = server.getMagnification() / mag; else if (server.hasPixelSizeMicrons()) { downsample = params.getDoubleParameterValue("pixelSizeMicrons") / server.getAveragedPixelSizeMicrons(); } else downsample = params.getDoubleParameterValue("downsample"); boolean createMaskROI = false; if (size.getWidth() <= 0 || size.getHeight() <= 0) { region = RegionRequest.createInstance(server.getPath(), downsample, pathObject.getROI()); createMaskROI = true; doCircular = false; int width = Math.min(server.getWidth(), xStart + size.width) - xStart; int height = Math.min(server.getHeight(), yStart + size.height) - yStart; region = RegionRequest.createInstance(server.getPath(), downsample, xStart, yStart, width, height, pathROI.getT(), pathROI.getZ()); img = server.readBufferedImage(region);
if (server != null) { if ((long)server.getWidth() * server.getHeight() * server.getBitsPerPixel() * server.nChannels() / 8 < maxImageSize || server.getPreferredDownsamples().length > 1) { logger.info("Returning server: {} for {}", server.getServerType(), path); return server; } else logger.warn("Cannot open {} with {} - image size too large ({} MB)", path, provider, server.getWidth() / (1024.0 * 1024.0 * 8.0) * server.getHeight() * server.getBitsPerPixel() * server.nChannels());
Rectangle bounds = new Rectangle(0, 0, runner.getImageServer().getWidth(), runner.getImageServer().getHeight()); PathObjectHierarchy hierarchy = runner.getHierarchy(); if (runner.getImageServer().hasPixelSizeMicrons()) radiusPixels = params.getDoubleParameterValue("radiusMicrons") / runner.getImageServer().getAveragedPixelSizeMicrons(); else radiusPixels = params.getDoubleParameterValue("radiusPixels");
boolean doCircular = params.getBooleanParameterValue("doCircular"); double downsample = server.getMagnification() / mag; int width = Math.min(server.getWidth(), xStart + size.width) - xStart; int height = Math.min(server.getHeight(), yStart + size.height) - yStart; RegionRequest region = RegionRequest.createInstance(server.getPath(), downsample, xStart, yStart, width, height, pathROI.getT(), pathROI.getZ()); img = server.readBufferedImage(region);
public static Collection<? extends ROI> computeTiledROIs(ImageData<?> imageData, PathObject parentObject, ImmutableDimension sizePreferred, ImmutableDimension sizeMax, boolean fixedSize, int overlap) { ROI parentROI = parentObject.getROI(); if (parentROI == null) parentROI = new RectangleROI(0, 0, imageData.getServer().getWidth(), imageData.getServer().getHeight()); return computeTiledROIs(parentROI, sizePreferred, sizeMax, fixedSize, overlap); }
@Override public boolean requiresTileRegion(final String serverPath, final ImageRegion region) { return server != null && server.getPath().equals(serverPath); }
public boolean addImagesForServer(final ImageServer<T> server) { List<String> subImages = server.getSubImageList(); if (subImages.isEmpty()) { return addImage(new ProjectImageEntry<>(this, server.getPath(), server.getDisplayedImageName(), null)); } boolean changes = false; for (String name : subImages) changes = changes | addImage(new ProjectImageEntry<>(this, server.getSubImagePath(name), name, null)); return changes; }
/** * The bounds are the coordinates in the original image space (in pixels) from which this image was extracted. * This is useful for whole slide images, from which this may be a downsampled part. * * @param path * @param img * @param bounds * @param downsampleFactor * @param pixelWidthMicrons * @param pixelHeightMicrons */ public PathBufferedImage(ImageServer<BufferedImage> server, RegionRequest request, BufferedImage img) { this.img = img; this.request = request; this.pixelWidthMicrons = server.getPixelWidthMicrons() * request.getDownsample(); this.pixelHeightMicrons = server.getPixelHeightMicrons() * request.getDownsample(); }
return; if (server.isRGB()) { channelOptions.clear(); channelOptions.add(rgbDirectChannel); int bpp = server.getBitsPerPixel(); if (server.nChannels() == 1) { channelOptions.add(new ChannelDisplayInfo.MultiChannelInfo("Channel 1", bpp, 0, 255, 255, 255)); for (int c = 0; c < server.nChannels(); c++) { int rgb = server.getDefaultChannelColor(c); channelOptions.add(new ChannelDisplayInfo.MultiChannelInfo("Channel " + (c + 1), bpp, c, ColorTools.red(rgb), ColorTools.green(rgb), ColorTools.blue(rgb))); if (server.isRGB() || !useColorLUTs) selectedChannels.add(channelOptions.get(0)); else if (useColorLUTs)
static String getDiameterString(final ImageServer<BufferedImage> server, final ParameterList params) { RegionType regionType = (RegionType)params.getChoiceParameterValue("region"); String shape = regionType == RegionType.SQUARE ? "Square" : (regionType == RegionType.CIRCLE ? "Circle" : "ROI"); String unit = server.hasPixelSizeMicrons() ? GeneralTools.micrometerSymbol() : "px"; double pixelSize = server.hasPixelSizeMicrons() ? params.getDoubleParameterValue("pixelSizeMicrons") : params.getDoubleParameterValue("downsample"); double regionSize = server.hasPixelSizeMicrons() ? params.getDoubleParameterValue("tileSizeMicrons") : params.getDoubleParameterValue("tileSizePixels"); if (regionType == RegionType.ROI) { return String.format("ROI: %.2f %s per pixel", pixelSize, unit); } else { return String.format("%s: Diameter %.1f %s: %.2f %s per pixel", shape, regionSize, unit, pixelSize, unit); } }
ImageServer<T> server = imageData.getServer(); String fwhmStringTemp; if (server != null && server.hasPixelSizeMicrons()) { fwhm = getParameterList(imageData).getDoubleParameterValue("fwhmMicrons"); fwhmStringTemp = GeneralTools.createFormatter(2).format(fwhm) + " " + GeneralTools.micrometerSymbol(); fwhm /= server.getAveragedPixelSizeMicrons();
boolean doCircular = params.getBooleanParameterValue("doCircular"); double downsample = server.getMagnification() / mag; return false; RegionRequest region = RegionRequest.createInstance(server.getPath(), downsample, (int)(pathROI.getCentroidX() + .5) - size.width/2, (int)(pathROI.getCentroidY() + .5) - size.height/2, size.width, size.height, pathROI.getT(), pathROI.getZ()); img = server.readBufferedImage(region);
case BLUE: case SATURATION: return imageData.getServer().isRGB(); case OD: case STAIN_1: case STAIN_2: case STAIN_3: return imageData.isBrightfield() && imageData.getServer().isRGB(); case CHANNEL_1: return !imageData.getServer().isRGB() && imageData.getServer().nChannels() >= 1; case CHANNEL_2: return !imageData.getServer().isRGB() && imageData.getServer().nChannels() >= 2; case CHANNEL_3: return !imageData.getServer().isRGB() && imageData.getServer().nChannels() >= 3; case CHANNEL_4: return !imageData.getServer().isRGB() && imageData.getServer().nChannels() >= 4; case CHANNEL_5: return !imageData.getServer().isRGB() && imageData.getServer().nChannels() >= 5; case CHANNEL_6: return !imageData.getServer().isRGB() && imageData.getServer().nChannels() >= 6; case CHANNEL_7: return !imageData.getServer().isRGB() && imageData.getServer().nChannels() >= 7; case CHANNEL_8: return !imageData.getServer().isRGB() && imageData.getServer().nChannels() >= 8; default: return false;
@Override public ParameterList getDefaultParameterList(final ImageData<BufferedImage> imageData) { boolean hasMicrons = imageData.getServer().hasPixelSizeMicrons(); boolean hasMagnification = !Double.isNaN(imageData.getServer().getMagnification()); params.getParameters().get("tileSizeMicrons").setHidden(!hasMicrons); params.getParameters().get("tileSizePx").setHidden(hasMicrons); params.getParameters().get("magnification").setHidden(!hasMagnification); params.getParameters().get("pixelSizeMicrons").setHidden(!hasMicrons || hasMagnification); params.getParameters().get("downsample").setHidden(hasMicrons || hasMagnification); return params; }