Changeset 21383
- Timestamp:
- Feb 6, 2009, 12:48:53 PM (17 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/imageops/psImageCovariance.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/imageops/psImageCovariance.c
r21382 r21383 8 8 #include <string.h> 9 9 10 #include "psAbort.h" 10 11 #include "psMemory.h" 11 12 #include "psConstants.h" … … 182 183 183 184 int xMin = covar->xMin, xMax = covar->xMax, yMin = covar->yMin, yMax = covar->yMax; // Range 184 int maxRadius = PS_MAX(PS_MAX(PS_MAX(xMax, yMax), -xMin), yMin); // Maximum radius of covariance matrix185 int maxRadius = PS_MAX(PS_MAX(PS_MAX(xMax, yMax), -xMin), -yMin); // Maximum radius of covariance matrix 185 186 186 187 double sum = 0.0; // Sum of covariance 187 psVector *radiusSum = psVectorAlloc(maxRadius , PS_TYPE_F64); // Totals within (square) radius188 psVector *radiusSum = psVectorAlloc(maxRadius + 1, PS_TYPE_F64); // Totals within (square) radius 188 189 psVectorInit(radiusSum, 0.0); 189 190 for (int y = yMin; y <= yMax; y++) { 190 191 for (int x = xMin; x <= xMax; x++) { 191 192 int radius = PS_MAX(abs(x), abs(y)); // Squarish radius 193 psAssert(radius <= maxRadius, "Radius doesn't fit"); 192 194 radiusSum->data.F64[radius] += fabsf(covar->kernel[y][x]); 193 195 sum += fabsf(covar->kernel[y][x]); … … 204 206 psFree(radiusSum); 205 207 208 if (radius >= maxRadius) { 209 radius = maxRadius; 210 } 211 206 212 // Generate truncated version 207 psKernel *trunc = psKernelAlloc(-radius, radius, -radius, radius); // Truncated covariance matrix 208 int numBytes = (2 * radius + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes to copy 209 for (int y = -radius; y <= radius; y++) { 210 memcpy(&trunc->kernel[y][-radius], &covar->kernel[y][-radius], numBytes); 213 int xMinNew = PS_MAX(xMin, -radius), xMaxNew = PS_MIN(xMax, radius); // New range in x 214 int yMinNew = PS_MAX(yMin, -radius), yMaxNew = PS_MIN(yMax, radius); // New range in y 215 psKernel *trunc = psKernelAlloc(xMinNew, xMaxNew, yMinNew, yMaxNew); // Truncated covariance matrix 216 int numBytes = (xMaxNew - xMinNew + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes to copy 217 for (int y = yMinNew; y <= yMaxNew; y++) { 218 memcpy(&trunc->kernel[y][xMinNew], &covar->kernel[y][xMinNew], numBytes); 211 219 } 212 220
Note:
See TracChangeset
for help on using the changeset viewer.
