Index: trunk/psLib/src/imageops/psImageCovariance.c
===================================================================
--- trunk/psLib/src/imageops/psImageCovariance.c	(revision 21467)
+++ trunk/psLib/src/imageops/psImageCovariance.c	(revision 22738)
@@ -43,4 +43,26 @@
     } else {
         covar = psImageCovarianceNone();
+    }
+
+    // Check for non-finite elements
+    for (int y = kernel->yMin; y <= kernel->yMax; y++) {
+        for (int x = kernel->xMin; x <= kernel->xMax; x++) {
+            if (!isfinite(kernel->kernel[y][x])) {
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                        "Non-finite covariance matrix element in kernel at %d,%d", x, y);
+                psFree(covar);
+                return NULL;
+            }
+        }
+    }
+    for (int y = covar->yMin; y <= covar->yMax; y++) {
+        for (int x = covar->xMin; x <= covar->xMax; x++) {
+            if (!isfinite(covar->kernel[y][x])) {
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                        "Non-finite covariance matrix element in covariance matrix at %d,%d", x, y);
+                psFree(covar);
+                return NULL;
+            }
+        }
     }
 
@@ -110,5 +132,5 @@
 float psImageCovarianceFactor(const psKernel *covariance)
 {
-    return covariance ? covariance->kernel[0][0] : NAN;
+    return covariance ? covariance->kernel[0][0] : 1.0;
 }
 
@@ -144,4 +166,11 @@
         for (int y = covar->yMin; y <= covar->yMax; y++) {
             for (int x = covar->xMin; x <= covar->xMax; x++) {
+                if (!isfinite(covar->kernel[y][x])) {
+                    psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                            "Non-finite covariance matrix element at %d,%d for input %d",
+                            x, y, i);
+                    psFree(sum);
+                    return NULL;
+                }
                 sum->kernel[y][x] += covar->kernel[y][x];
             }
@@ -192,4 +221,9 @@
             int radius = PS_MAX(abs(x), abs(y)); // Squarish radius
             psAssert(radius <= maxRadius, "Radius doesn't fit");
+            if (!isfinite(covar->kernel[y][x])) {
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Non-finite covariance matrix element at %d,%d",
+                        x, y);
+                return NULL;
+            }
             radiusSum->data.F64[radius] += fabsf(covar->kernel[y][x]);
             sum += fabsf(covar->kernel[y][x]);
