Index: trunk/psLib/src/imageops/psImageCovariance.c
===================================================================
--- trunk/psLib/src/imageops/psImageCovariance.c	(revision 21382)
+++ trunk/psLib/src/imageops/psImageCovariance.c	(revision 21383)
@@ -8,4 +8,5 @@
 #include <string.h>
 
+#include "psAbort.h"
 #include "psMemory.h"
 #include "psConstants.h"
@@ -182,12 +183,13 @@
 
     int xMin = covar->xMin, xMax = covar->xMax, yMin = covar->yMin, yMax = covar->yMax; // Range
-    int maxRadius = PS_MAX(PS_MAX(PS_MAX(xMax, yMax), -xMin), yMin); // Maximum radius of covariance matrix
+    int maxRadius = PS_MAX(PS_MAX(PS_MAX(xMax, yMax), -xMin), -yMin); // Maximum radius of covariance matrix
 
     double sum = 0.0;                   // Sum of covariance
-    psVector *radiusSum = psVectorAlloc(maxRadius, PS_TYPE_F64); // Totals within (square) radius
+    psVector *radiusSum = psVectorAlloc(maxRadius + 1, PS_TYPE_F64); // Totals within (square) radius
     psVectorInit(radiusSum, 0.0);
     for (int y = yMin; y <= yMax; y++) {
         for (int x = xMin; x <= xMax; x++) {
             int radius = PS_MAX(abs(x), abs(y)); // Squarish radius
+            psAssert(radius <= maxRadius, "Radius doesn't fit");
             radiusSum->data.F64[radius] += fabsf(covar->kernel[y][x]);
             sum += fabsf(covar->kernel[y][x]);
@@ -204,9 +206,15 @@
     psFree(radiusSum);
 
+    if (radius >= maxRadius) {
+        radius = maxRadius;
+    }
+
     // Generate truncated version
-    psKernel *trunc = psKernelAlloc(-radius, radius, -radius, radius); // Truncated covariance matrix
-    int numBytes = (2 * radius + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes to copy
-    for (int y = -radius; y <= radius; y++) {
-        memcpy(&trunc->kernel[y][-radius], &covar->kernel[y][-radius], numBytes);
+    int xMinNew = PS_MAX(xMin, -radius), xMaxNew = PS_MIN(xMax, radius); // New range in x
+    int yMinNew = PS_MAX(yMin, -radius), yMaxNew = PS_MIN(yMax, radius); // New range in y
+    psKernel *trunc = psKernelAlloc(xMinNew, xMaxNew, yMinNew, yMaxNew); // Truncated covariance matrix
+    int numBytes = (xMaxNew - xMinNew + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes to copy
+    for (int y = yMinNew; y <= yMaxNew; y++) {
+        memcpy(&trunc->kernel[y][xMinNew], &covar->kernel[y][xMinNew], numBytes);
     }
 
