From 2f23e09488fc0f3d53d288bfb48fa6ad32d078cd Mon Sep 17 00:00:00 2001 From: jakubs <jakubs> Date: Tue, 25 Feb 2014 10:07:07 +0000 Subject: [PATCH] BIS-665 SP-1202 make it possible to apply intensity rescale filter on more images SVN: 30595 --- .../cisd/common/image/IntensityRescaling.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/common/source/java/ch/systemsx/cisd/common/image/IntensityRescaling.java b/common/source/java/ch/systemsx/cisd/common/image/IntensityRescaling.java index 8995eef5d82..8b868385436 100644 --- a/common/source/java/ch/systemsx/cisd/common/image/IntensityRescaling.java +++ b/common/source/java/ch/systemsx/cisd/common/image/IntensityRescaling.java @@ -438,7 +438,34 @@ public class IntensityRescaling */ public static BufferedImage rescaleIntensityLevelTo8Bits(BufferedImage image, Levels levels) { - return rescaleIntensityLevelTo8Bits(new GrayscalePixels(image), levels); + final int width = image.getWidth(); + final int height = image.getHeight(); + final BufferedImage rescaledImage = + new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + WritableRaster rescaledRaster = rescaledImage.getRaster(); + + final float dynamicRange = 255f / (levels.maxLevel - levels.minLevel); + + for (int y = 0; y < height; ++y) + { + for (int x = 0; x < width; ++x) + { + for (Channel channel : Channel.values()) + { + int originalIntensity = (image.getRGB(x, y) >> channel.getShift()) & 0xff; + + // cut all intensities above the white point + int intensity = Math.min(levels.maxLevel, originalIntensity); + // cut all intensities below the black point and move the origin to 0 + intensity = Math.max(0, intensity - levels.minLevel); + // normalize to [0, 1] and rescale to 8 bits + intensity = (int) (0.5 + (intensity * dynamicRange)); + + rescaledRaster.setSample(x, y, channel.getBand(), intensity); + } + } + } + return rescaledImage; } public static BufferedImage rescaleIntensityLevelTo8Bits(BufferedImage image, Levels levels, -- GitLab