Changeset 2663 for libpipi/trunk/pipi/dither/dbs.c
- Timestamp:
- 08/03/08 20:36:17 (5 years ago)
- File:
-
- 1 edited
-
libpipi/trunk/pipi/dither/dbs.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libpipi/trunk/pipi/dither/dbs.c
r2651 r2663 25 25 #include "pipi_internals.h" 26 26 27 #define N 527 #define N 7 28 28 #define NN ((N * 2 + 1)) 29 29 30 /* FIXME: use a better HVS than a simple gaussian; adding two gaussians31 * seemed to be a lot more efficient. Get rid of pipi_gaussian_blur calls32 * at the same time. */33 30 /* FIXME: though the algorithm is supposed to stop, we do not have a real, 34 31 * guaranteed stop condition here. */ 35 32 36 static void makegauss(double mat[NN][NN], double sigma)33 pipi_image_t *pipi_dbs(pipi_image_t *src) 37 34 { 38 double t = 0; 39 int i, j; 40 41 sigma = 2. * sigma * sigma; 35 double kernel[NN * NN]; 36 double t = 0.; 37 pipi_image_t *dst, *tmp1, *tmp2; 38 pipi_pixels_t *srcp, *dstp, *tmp1p, *tmp2p; 39 float *srcdata, *dstdata, *tmp1data, *tmp2data; 40 int i, j, w, h; 42 41 43 42 for(j = 0; j < NN; j++) … … 46 45 double a = (double)(i - N); 47 46 double b = (double)(j - N); 48 mat[i][j] = pow(M_E, - (a * a + b * b) / sigma); 49 t += mat[i][j]; 47 kernel[j * NN + i] = 48 1.0 * exp(-(a * a + b * b) / (2. * 1.5 * 1.5)) 49 + 0.1 * exp(-(a * a + b * b) / (2. * 0.6 * 0.6)); 50 t += kernel[j * NN + i]; 50 51 } 51 52 52 53 for(j = 0; j < NN; j++) 53 54 for(i = 0; i < NN; i++) 54 mat[i][j] /= t; 55 } 56 57 pipi_image_t *pipi_dbs(pipi_image_t *src) 58 { 59 double mat[NN][NN]; 60 double sigma = 1.2; 61 pipi_image_t *dst, *tmp1, *tmp2; 62 pipi_pixels_t *srcp, *dstp, *tmp1p, *tmp2p; 63 float *srcdata, *dstdata, *tmp1data, *tmp2data; 64 int w, h; 65 66 makegauss(mat, sigma); 55 kernel[j * NN + i] /= t; 67 56 68 57 w = src->w; … … 72 61 srcdata = (float *)srcp->pixels; 73 62 74 tmp1 = pipi_ gaussian_blur(src, sigma);63 tmp1 = pipi_convolution(src, NN, NN, kernel); 75 64 tmp1p = pipi_getpixels(tmp1, PIPI_PIXELS_Y_F); 76 65 tmp1data = (float *)tmp1p->pixels; 77 66 78 67 /* The initial dither is an empty image. So is its blurred version, 79 * but I leave the pipi_ gaussian_blur() call here in case we choose68 * but I leave the pipi_convolution() call here in case we choose 80 69 * to change the way to create the initial dither. */ 81 70 dst = pipi_new(w, h); … … 83 72 dstdata = (float *)dstp->pixels; 84 73 85 tmp2 = pipi_ gaussian_blur(dst, sigma);74 tmp2 = pipi_convolution(dst, NN, NN, kernel); 86 75 tmp2p = pipi_getpixels(tmp2, PIPI_PIXELS_Y_F); 87 76 tmp2data = (float *)tmp2p->pixels; … … 90 79 { 91 80 int changes = 0; 92 int x, y, i, j,n;81 int x, y, n; 93 82 94 83 for(y = 0; y < h; y++) … … 114 103 continue; 115 104 116 m = mat[i + N][j+ N];105 m = kernel[(j + N) * NN + i + N]; 117 106 p = tmp1data[(y + j) * w + x + i]; 118 107 q1 = tmp2data[(y + j) * w + x + i]; … … 153 142 if(i - idx + N < 0 || i - idx + N >= NN) 154 143 continue; 155 ma = mat[i + N][j+ N];156 mb = mat[i - idx + N][j - idy+ N];144 ma = kernel[(j + N) * NN + i + N]; 145 mb = kernel[(j - idy + N) * NN + i - idx + N]; 157 146 p = tmp1data[(y + j) * w + x + i]; 158 147 q1 = tmp2data[(y + j) * w + x + i]; … … 183 172 for(i = -N; i < N + 1; i++) 184 173 { 185 double m = mat[i + N][j+ N];174 double m = kernel[(j + N) * NN + i + N]; 186 175 if(y + j >= 0 && y + j < h 187 176 && x + i >= 0 && x + i < w) 188 177 { 189 doublet = tmp2data[(y + j) * w + x + i];178 t = tmp2data[(y + j) * w + x + i]; 190 179 tmp2data[(y + j) * w + x + i] = t + m * (d2 - d); 191 180 } … … 193 182 && x + opx + i >= 0 && x + opx + i < w) 194 183 { 195 doublet = tmp2data[(y + opy + j) * w + x + opx + i];184 t = tmp2data[(y + opy + j) * w + x + opx + i]; 196 185 tmp2data[(y + opy + j) * w + x + opx + i] 197 186 = t + m * (d - d2);
Note: See TracChangeset
for help on using the changeset viewer.
