1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| void HorizontalSmoothing (CImg<double> in, CImg<double> & out, double alpha)
{
double a1,b1,c1,d1,a2,b2,c2,d2,ea,b;
int dx=in.dimx(), dy=in.dimy();
CImg<double> B1(dx);
CImg<double> B2(dx);
ea = exp(-alpha);
b = (1-ea)*(1-ea)/(1+2*alpha*ea - ea*ea);
a1 = b;
a2 = b*ea * (alpha+1);
b1 = b * ea * (alpha-1);
b2 = -b *ea *ea;
c1 = 2 * ea;
c2 = c1;
d1 = -ea * ea;
d2 = d1;
for (int j=0; j<dy; j++)
{
B1(0) = in(0,j) * (a1+b1) / (1-c1-d1);
B1(1) = in(1,j) * a1 + b1 * in(0,j) + B1(0) * (c1+d1);
for (int i=2; i<dx; i++)
B1(i) = a1 * in(i,j) + b1 * in(i-1, j) + c1 * B1(i-1) + d1 * B1(i-2) ;
B2(dx-1) = in(dx-1,j) * (a2+b2)/(1-c2-d2);
B2(dx-2) = in(dx-2,j) * a2 + in(dx-1,j) * b2 + B2(dx-1) * (c2+d2);
for (int i=dx-3; i>=0; i--)
B2(i) = a2 * in(i,j) + b2 * in(i+1,j) + c2 * B2(i+1) + d2 * B2(i+2);
for (int i=0; i<dx; i++)
out(i,j) = B1(i) + B2(i);
}
} |