Index: branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.c
===================================================================
--- branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.c	(revision 26587)
+++ branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.c	(revision 26588)
@@ -220,4 +220,6 @@
     }
     if (forceZeroNull) {
+        // Force rescaling and subtraction of null pixel even though the order doesn't indicate it's even
+        scale2D = 1.0 / fabs(sum);
         zeroNull = true;
     }
@@ -236,5 +238,5 @@
 
     psBinaryOp(preCalc->kernel->image, preCalc->kernel->image, "*", psScalarAlloc(scale2D, PS_TYPE_F32));
-    penalty *= PS_SQR(scale2D);
+    penalty *= 1.0 / sum2;
 
     if (zeroNull) {
@@ -242,16 +244,17 @@
     }
 
-#if 0
-    sum = 0.0;   // Sum of kernel component
-    min = FLT_MAX;
-    max = FLT_MIN;
-    for (int v = -size; v <= size; v++) {
-        for (int u = -size; u <= size; u++) {
-            sum += preCalc->kernel->kernel[v][u];
-            min = PS_MIN(preCalc->kernel->kernel[v][u], min);
-            max = PS_MAX(preCalc->kernel->kernel[v][u], max);
-        }
-    }
-    fprintf(stderr, "%d mod: %lf, null: %f, min: %lf, max: %lf, scale: %f\n", index, sum, preCalc->kernel->kernel[0][0], min, max, scale2D);
+#if 1
+    {
+        double sum = 0.0;   // Sum of kernel component
+        float min = INFINITY, max = -INFINITY;  // Minimum and maximum kernel value
+        for (int v = -size; v <= size; v++) {
+            for (int u = -size; u <= size; u++) {
+                sum += preCalc->kernel->kernel[v][u];
+                min = PS_MIN(preCalc->kernel->kernel[v][u], min);
+                max = PS_MAX(preCalc->kernel->kernel[v][u], max);
+            }
+        }
+        fprintf(stderr, "%d mod: %lf, null: %f, min: %lf, max: %lf, scale: %f\n", index, sum, preCalc->kernel->kernel[0][0], min, max, scale2D);
+    }
 #endif
 
