Changeset 24497
- Timestamp:
- Jun 18, 2009, 4:28:43 PM (17 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/imageops/psImageUnbin.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/imageops/psImageUnbin.c
r21040 r24497 30 30 // DX, DY are the binning factor 31 31 // dx, dy is the distance is high-res pixels to the 0,0 corner of the first 32 // binned pixel. 32 // binned pixel. 33 33 // XXX check that this is still consistent with psphotImageMedian... 34 34 psImage *psImageUnbin(psImage *out, const psImage *in, const psImageBinning *binning) … … 69 69 // (Xs,Ys) : (Xe,Ye) : binned pixel centers in unbinned coords 70 70 // corresponding to (Ix,Iy), (Ix+1,Iy+1) 71 // XXX should this be "+ dx" and + dy?71 // XXX should this be "+ dx" and + dy? 72 72 int Xs = PS_MAX (0, PS_MIN (Nx, psImageBinningGetFineX(binning, Ix + 0.5))); 73 73 int Ys = PS_MAX (0, PS_MIN (Ny, psImageBinningGetFineY(binning, Iy + 0.5))); … … 76 76 77 77 for (int iy = Ys; (iy < Ye) && (iy < Ny); iy++) { 78 float dY = (iy - Ys) / (float) DY;79 float rY = 1.0 - dY;78 float dY = (iy - Ys) / (float) DY; 79 float rY = 1.0 - dY; 80 80 float Vxs = V10*dY + V00*rY; 81 81 float Vxe = V11*dY + V01*rY; 82 82 83 // Vxs = (V10 - V00)*(iy - Ys) / DY + V00; 84 // Vxe = (V11 - V01)*(iy - Ys) / DY + V01; 85 86 // dVx = Vxs_1 - Vxs_187 // dVx = (V10*dY_1 + V00*rY_1) - (V10*dY_0 + V00*rY_0);88 // dY_0 = (iy - Ys)/DY = iy/DY - Ys/DY;89 // dY_1 = (iy + 1 - Ys)/DY = iy/DY - Ys/DY + 1/DY;90 // rY_0 = 1 - dY_0;91 // rY_1 = 1 - dY_1;92 // dVx = V10*(ddY) + V00*(drY);93 // ddY = 1/DY;94 // drY = -1/DY;95 96 // dVxs = (V10 - V00)/DY;97 // dVxe = (V11 - V01)/DY;98 99 // ddV = (Vxe_1 - Vxs_1)/DX - (Vxe_0 - Vxs_0)/DX;100 // ddV = (Vxe_1 - Vxe_0)/DX - (Vxs_1 - Vxs_0)/DX;101 // ddV = (V11 - V01 - V10 + V00)/(DX*DY);83 // Vxs = (V10 - V00)*(iy - Ys) / DY + V00; 84 // Vxe = (V11 - V01)*(iy - Ys) / DY + V01; 85 86 // dVx = Vxs_1 - Vxs_1 87 // dVx = (V10*dY_1 + V00*rY_1) - (V10*dY_0 + V00*rY_0); 88 // dY_0 = (iy - Ys)/DY = iy/DY - Ys/DY; 89 // dY_1 = (iy + 1 - Ys)/DY = iy/DY - Ys/DY + 1/DY; 90 // rY_0 = 1 - dY_0; 91 // rY_1 = 1 - dY_1; 92 // dVx = V10*(ddY) + V00*(drY); 93 // ddY = 1/DY; 94 // drY = -1/DY; 95 96 // dVxs = (V10 - V00)/DY; 97 // dVxe = (V11 - V01)/DY; 98 99 // ddV = (Vxe_1 - Vxs_1)/DX - (Vxe_0 - Vxs_0)/DX; 100 // ddV = (Vxe_1 - Vxe_0)/DX - (Vxs_1 - Vxs_0)/DX; 101 // ddV = (V11 - V01 - V10 + V00)/(DX*DY); 102 102 103 103 float dV = (Vxe - Vxs) / DX; … … 128 128 for (int ix = 0; ix < Xs; ix++) { 129 129 vOut[iy][ix] = V; 130 // assert (fabs(V - psImageUnbinPixel(ix, iy, in, binning)) < UNBIN_TOL*fabs(V));130 // assert (fabs(V - psImageUnbinPixel(ix, iy, in, binning)) < UNBIN_TOL*fabs(V)); 131 131 } 132 132 V += dV; … … 141 141 for (int ix = Xe; ix < Nx; ix++) { 142 142 vOut[iy][ix] = V; 143 // assert (fabs(V - psImageUnbinPixel(ix, iy, in, binning)) < UNBIN_TOL*fabs(V));143 // assert (fabs(V - psImageUnbinPixel(ix, iy, in, binning)) < UNBIN_TOL*fabs(V)); 144 144 } 145 145 V += dV; … … 163 163 for (int ix = Xs; (ix < Xe) && (ix < Nx); ix++) { 164 164 vOut[iy][ix] = V; 165 // assert (fabs(V - psImageUnbinPixel(ix, iy, in, binning)) < UNBIN_TOL*fabs(V));165 // assert (fabs(V - psImageUnbinPixel(ix, iy, in, binning)) < UNBIN_TOL*fabs(V)); 166 166 V += dV; 167 167 } … … 176 176 for (int ix = Xs; (ix < Xe) && (ix < Nx); ix++) { 177 177 vOut[iy][ix] = V; 178 // assert (fabs(V - psImageUnbinPixel(ix, iy, in, binning)) < UNBIN_TOL*fabs(V));178 // assert (fabs(V - psImageUnbinPixel(ix, iy, in, binning)) < UNBIN_TOL*fabs(V)); 179 179 V += dV; 180 180 } … … 186 186 { 187 187 float V; 188 // center of last pixel 189 int Xs = PS_MAX (0, PS_MIN (Nx, psImageBinningGetFineX(binning, 0 + 0.5)));190 int Xe = PS_MAX (0, PS_MIN (Nx, psImageBinningGetFineX(binning, nx - 0.5)));191 int Ys = PS_MAX (0, PS_MIN (Ny, psImageBinningGetFineY(binning, 0 + 0.5)));192 int Ye = PS_MAX (0, PS_MIN (Ny, psImageBinningGetFineY(binning, ny - 0.5)));188 // center of last pixel 189 int Xs = PS_MAX (0, PS_MIN (Nx, psImageBinningGetFineX(binning, 0 + 0.5))); 190 int Xe = PS_MAX (0, PS_MIN (Nx, psImageBinningGetFineX(binning, nx - 0.5))); 191 int Ys = PS_MAX (0, PS_MIN (Ny, psImageBinningGetFineY(binning, 0 + 0.5))); 192 int Ye = PS_MAX (0, PS_MIN (Ny, psImageBinningGetFineY(binning, ny - 0.5))); 193 193 194 194 // 0,0 195 195 V = vIn[0][0]; 196 // assert (fabs(V - psImageUnbinPixel(0, 0, in, binning)) < UNBIN_TOL*fabs(V));196 // assert (fabs(V - psImageUnbinPixel(0, 0, in, binning)) < UNBIN_TOL*fabs(V)); 197 197 198 198 for (int iy = 0; iy < Ys; iy++) … … 204 204 // Nx,0 205 205 V = vIn[0][nx-1]; 206 // assert (fabs(V - psImageUnbinPixel(Nx-1, 0, in, binning)) < UNBIN_TOL*fabs(V));206 // assert (fabs(V - psImageUnbinPixel(Nx-1, 0, in, binning)) < UNBIN_TOL*fabs(V)); 207 207 208 208 for (int iy = 0; iy < Ys; iy++) … … 214 214 // 0,Ny 215 215 V = vIn[ny-1][0]; 216 // assert (fabs(V - psImageUnbinPixel(0, Ny-1, in, binning)) < UNBIN_TOL*fabs(V));216 // assert (fabs(V - psImageUnbinPixel(0, Ny-1, in, binning)) < UNBIN_TOL*fabs(V)); 217 217 218 218 for (int iy = Ye; iy < Ny; iy++) … … 224 224 // Nx,Ny 225 225 V = vIn[ny-1][nx-1]; 226 // assert (fabs(V - psImageUnbinPixel(Nx-1, Ny-1, in, binning)) < UNBIN_TOL*fabs(V));226 // assert (fabs(V - psImageUnbinPixel(Nx-1, Ny-1, in, binning)) < UNBIN_TOL*fabs(V)); 227 227 228 228 for (int iy = Ye; iy < Ny; iy++) … … 243 243 244 244 double psImageUnbinPixel(const double xFine, const double yFine, // desired Unbinned point (parent coords) 245 const psImage *in, // binned image246 const psImageBinning *binning) //!< Overhang245 const psImage *in, // binned image 246 const psImageBinning *binning) //!< Overhang 247 247 { 248 248 PS_ASSERT_IMAGE_NON_NULL(in, NAN); … … 273 273 274 274 if ((x < -nXedge) || (x > in->numCols + nXedge) || (y < -nYedge) || (y > in->numRows + nYedge)) { 275 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Point (% f,%f) lies outside binned image", x, y);275 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Point (%lf,%lf) lies outside binned image", x, y); 276 276 return NAN; 277 277 } … … 281 281 // if we have a single pixel, there is no spatial information 282 282 if ((in->numCols == 1) && (in->numRows == 1)) { 283 const double value = in->data.F32[0][0];284 return value;283 const double value = in->data.F32[0][0]; 284 return value; 285 285 } 286 286 … … 306 306 // if Nx == 1, we have no x-dir spatial information 307 307 if (in->numCols == 1) { 308 double V0 = in->data.F32[Ys][Xs];309 double V1 = in->data.F32[Ye][Xs];310 311 const double value = V0*ry + V1*dy;312 return value;313 } 308 double V0 = in->data.F32[Ys][Xs]; 309 double V1 = in->data.F32[Ye][Xs]; 310 311 const double value = V0*ry + V1*dy; 312 return value; 313 } 314 314 315 315 // if Ny == 1, we have no y-dir spatial information 316 316 if (in->numRows == 1) { 317 double V0 = in->data.F32[Ys][Xs];318 double V1 = in->data.F32[Ys][Xe];319 320 const double value = V0*rx + V1*dx;321 return value;322 } 323 324 // Vxy 317 double V0 = in->data.F32[Ys][Xs]; 318 double V1 = in->data.F32[Ys][Xe]; 319 320 const double value = V0*rx + V1*dx; 321 return value; 322 } 323 324 // Vxy 325 325 double V00 = in->data.F32[Ys][Xs]; 326 326 double V01 = in->data.F32[Ye][Xs]; … … 332 332 // corners 333 333 if ((dx < 0.0) && (dy < 0.0)) { 334 return V00;335 } 334 return V00; 335 } 336 336 if ((dx > 1.0) && (dy < 0.0)) { 337 return V10;338 } 337 return V10; 338 } 339 339 if ((dx < 0.0) && (dy > 1.0)) { 340 return V01;341 } 340 return V01; 341 } 342 342 if ((dx > 1.0) && (dy > 1.0)) { 343 return V11;344 } 343 return V11; 344 } 345 345 346 346 // sides 347 347 if (dx < 0.0) { 348 value = V00*ry + V01*dy;349 return value;350 } 348 value = V00*ry + V01*dy; 349 return value; 350 } 351 351 if (dy < 0.0) { 352 value = V00*rx + V10*dx;353 return value;354 } 352 value = V00*rx + V10*dx; 353 return value; 354 } 355 355 if (dx > 1.0) { 356 value = V10*ry + V11*dy;357 return value;358 } 356 value = V10*ry + V11*dy; 357 return value; 358 } 359 359 if (dy > 1.0) { 360 value = V01*rx + V11*dx;361 return value;362 } 360 value = V01*rx + V11*dx; 361 return value; 362 } 363 363 364 364 // bilinear interpolation
Note:
See TracChangeset
for help on using the changeset viewer.
