ref: c8ade95ba71fb1b63d975c390114cb7aa6fdc4cc
parent: 6cef9c8e6d812216fa88288831ec8c414010c265
author: rodri <rgl@antares-labs.eu>
date: Sun Apr 27 16:25:36 EDT 2025
image/convolution: more fixes
--- a/image/convolution.c
+++ b/image/convolution.c
@@ -88,16 +88,15 @@
static void
normalize(double *k, int dim)
{
- double avg;
+ double denom;
int i, j;
- avg = coeffsum(k, dim);
- avg /= dim*dim;
- if(avg == 0)
- avg = 1;
+ denom = coeffsum(k, dim);
+ if(denom == 0)
+ return;
for(j = 0; j < dim; j++)
for(i = 0; i < dim; i++)
- k[j*dim+i] /= avg;
+ k[j*dim+i] /= denom;
}
static double *
@@ -130,17 +129,14 @@
convolve(double *d, double *s, int dim)
{
int i, j;
- double denom, r;
+ double r;
- denom = coeffsum(s, dim);
- denom = denom == 0? 1: 1/denom;
-
modulate(d, s, dim);
r = 0;
for(j = 0; j < dim; j++)
for(i = 0; i < dim; i++)
r += d[j*dim+i];
- return fabs(r*denom);
+ return r;
}
static uchar
@@ -158,7 +154,7 @@
double **im;
Rectangle imr;
Point imc, p, cp;
- double c;
+ double denom, c;
int i;
im = malloc(d->nchan*sizeof(double*));
@@ -173,6 +169,9 @@
imr = Rect(0,0,dim,dim);
imc = Pt(dim/2, dim/2);
+ denom = coeffsum(k, dim);
+ denom = denom == 0? 1: 1/denom;
+
for(p.y = s->r.min.y; p.y < s->r.max.y; p.y++)
for(p.x = s->r.min.x; p.x < s->r.max.x; p.x++){
for(cp.y = imr.min.y; cp.y < imr.max.y; cp.y++)
@@ -181,7 +180,7 @@
im[i][cp.y*dim + cp.x] = sample(s, addpt(p, subpt(cp, imc)), i);
}
for(i = 0; i < d->nchan; i++){
- c = convolve(im[i], k, dim);
+ c = fabs(convolve(im[i], k, dim) * denom);
if(saturate)
c = clamp(c, 0, 0xFF);
*(byteaddr(d, p) + i) = c;
--
⑨