2 ***********************************************************
3 $SNARK_Header: S N A R K 1 4 - A PICTURE RECONSTRUCTION PROGRAM $
4 $HeadURL: svn://dig.cs.gc.cuny.edu/snark/trunk/src/snark/smooth.cpp $
5 $LastChangedRevision: 97 $
6 $Date: 2014-07-02 20:07:41 -0400 (Wed, 02 Jul 2014) $
8 ***********************************************************
10 A NINE-POINT WEIGHTED, NON-LINEAR SMOOTHING PROCEDURE.
11 FOR DETAILS, SEE THE SNARK MANUAL.
25 INTEGER m, // number of rows
26 INTEGER n, // number of columns
27 REAL thresh, // treshold
28 REAL w1, // weight of center
29 REAL w2, // weight of horizontal and vertical neighbous
30 REAL w3 // weight of diagonal neighbous
33 REAL* row1 = new REAL[n]; // row buffer 1
34 REAL* row2 = new REAL[n]; // row buffer 2
35 REAL* pres = row2; // current row before smooth
36 REAL* prev = row1; // previous row before smooth
38 BOOLEAN once = TRUE; // message flag
40 INTEGER l = 0; // curent pixel index
41 REAL centre; // curent pixel value
43 REAL smuth; // weighted sum of neighbours
44 REAL divide; // sum of weights
45 REAL value; // neighbour value
47 for (int i = 0; i < m; i++)
50 REAL* itemp = prev; // swap the buffers
54 for (int j = 0; j < n; j++)
65 { // if not first column
66 value = prev[j - 1]; // prev row prev column
68 if ((REAL) fabs(value - centre) <= thresh)
75 value = prev[j]; // prev row same column
77 if ((REAL) fabs(value - centre) <= thresh)
84 { // if not last column
85 value = prev[j + 1]; // prev row next column
87 if ((REAL) fabs(value - centre) <= thresh)
96 { // if not first column
97 value = pres[j - 1]; // same row prev column
99 if ((REAL) fabs(value - centre) <= thresh)
107 { // if not last column
108 value = a[l + 1]; // same row next column
110 if ((REAL) fabs(value - centre) <= thresh)
120 { // if not first column
121 value = a[l + n - 1]; // next row prev column
123 if ((REAL) fabs(value - centre) <= thresh)
130 value = a[l + n]; // next row same column
132 if ((REAL) fabs(value - centre) <= thresh)
139 { // if not last column
140 value = a[l + n + 1]; // next row next column
142 if ((REAL) fabs(value - centre) <= thresh)
150 if ((REAL) fabs(divide) > Consts.zero)
152 a[l] = smuth / divide;
158 fprintf(output, "\n **** warning - sum of weights = zero");
162 //pragma message( "to check!" )
163 a[l] = ((smuth - Consts.infin) > 0) ? (REAL) 1.0 : (smuth == Consts.infin) ? (REAL) 0.0 : (REAL) -1.0;
170 delete[] row1; // bug 92 - Lajos - 03/02/2005
171 delete[] row2; // bug 92 - Lajos - 03/02/2005