From 25c0c4ce9989f77ada6a914e0927bb6eae8904cf Mon Sep 17 00:00:00 2001
From: fedoreno <fedoreno>
Date: Fri, 23 May 2014 11:02:48 +0000
Subject: [PATCH] Added white point normalization for the resulting mix image

SVN: 31575
---
 .../systemsx/cisd/common/image/MixColors.java | 50 ++++++++++++++++---
 1 file changed, 43 insertions(+), 7 deletions(-)

diff --git a/common/source/java/ch/systemsx/cisd/common/image/MixColors.java b/common/source/java/ch/systemsx/cisd/common/image/MixColors.java
index 551a311c3bd..340ffcd3f90 100644
--- a/common/source/java/ch/systemsx/cisd/common/image/MixColors.java
+++ b/common/source/java/ch/systemsx/cisd/common/image/MixColors.java
@@ -222,7 +222,7 @@ public class MixColors
             // blue = Math.max(blue, b);
 
         }
-        return getColor(red, green, blue);
+        return getColor(red, green , blue );
     }
 
     /**
@@ -274,14 +274,49 @@ public class MixColors
 
         int width = images[0].getWidth();
         int height = images[0].getHeight();
-        final BufferedImage mixed = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
 
-        for (int y = 0; y < images[0].getHeight(); ++y)
+        final Color[][] notNormalizedPixels = new Color[width][height];
+        float whitePointSumIntencity = 0f; 
+        Color whitePointColor = new Color(0); 
+        final float[] mixedComponents = new float[4];
+        
+        
+        // store the colours and calculate white point
+        for (int y = 0; y < height; ++y)
         {
-            for (int x = 0; x < images[0].getWidth(); ++x)
+            for (int x = 0; x < width; ++x)
             {
                 Color mixColor = mergeColorsAlgorithm.merge(colors, x, y, images);
-                mixed.setRGB(x, y, mixColor.getRGB());
+                notNormalizedPixels[x][y] = mixColor;
+                
+				mixColor.getRGBColorComponents(mixedComponents);
+				float sumIntencity = 0f;
+				for (int i=0; i<mixedComponents.length; i++){
+					sumIntencity += mixedComponents[i];
+				}
+				
+				if (whitePointSumIntencity < sumIntencity) {
+					whitePointColor = mixColor;
+					whitePointSumIntencity = sumIntencity;
+				}
+            }
+        }
+        
+        final float whitePointFactor = 255f / getMaxComponent(whitePointColor.getRed(), whitePointColor.getGreen(), whitePointColor.getBlue());
+        
+        final BufferedImage mixed = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+
+        // apply white point adjustments to the final image
+        for (int y = 0; y < height; ++y)
+        {
+            for (int x = 0; x < width; ++x)
+            {
+            	notNormalizedPixels[x][y].getRGBColorComponents(mixedComponents);
+				for (int i=0; i<mixedComponents.length; i++){
+					mixedComponents[i] *= whitePointFactor;
+				}
+
+				mixed.setRGB(x, y, new Color(images[0].getColorModel().getColorSpace(), mixedComponents, 1).getRGB());
             }
         }
         return mixed;
@@ -327,7 +362,8 @@ public class MixColors
         {
             isGrayscale = isGrayscale && images[i].getColorModel().getNumColorComponents() == 1;
             ColorModel colorModel = images[i].getColorModel();
-            int componentSize;
+            operationLog.info("===== Colormodel is: " + colorModel.toString());
+            /*int componentSize;
             try
             {
                 componentSize = colorModel.getComponentSize(0);
@@ -339,7 +375,7 @@ public class MixColors
             if (componentSize != 8)
             {
                 throw new IllegalArgumentException("Only 8-bit images can be merged.");
-            }
+            }*/
         }
         return createColorMergingAlgorithm(quadratic, saturationEnhancementFactor, isGrayscale,
                 numberOfImages);
-- 
GitLab