|
|
A small library (written in C) allowing 2D or 3D image resampling using a 4x4 matrix. The value of a point in the result image is estimated
| Original grey level image |
|---|
![]() |
A 4 by 4 transformation matrix M (with homogenous coordinates) is of the form
| M = | R00 | R01 | R02 | T0 |
| R10 | R11 | R12 | T1 | |
| R20 | R21 | R22 | T2 | |
| 0 | 0 | 0 | 1 |
The Rij define an affine matrix (rotation in case of rigid transformation), while the Ti define a translation vector. The transformation of a point M = (x,y,z) into M' = (x',y',z') is done using
| x' | = M | x |
| y' | y | |
| z' | z | |
| 1 | 1 |
which is equivalent to
| x' | = R | x | + T |
| y' | y | ||
| z' | z |
The principle of resampling is then to compute, for each point (of integer coordinates) in the result image its correspondant (of real coordinates) in the original image, and to estimate the grey level value of the correspondant. Thus, the transformation from the original image into the result image is the inverse of the given matrix.
Consider the matrix
| M = | 0.8660254 | -0.5 | 0.0 | 80.5147742 |
| 0.5 | 0.8660254 | 0.0 | -46.4852258 | |
| 0.0 | 0.0 | 1.0 | 1.0 | |
| 0 | 0 | 0 | 1 |
It correspond to a 2D rigid transformation with a rotation of 30 degrees (X axis is from left to right, Y axis is from top to bottom) of center (127,127) (invariant point for the transformation). Using directly this matrix with the resampling program yields a rotation of -30 degrees as shown below.
| %test-reech-pnm greg-rmn.pgm greg-rmn-reech1.ppm -mat matrix.example |
![]() |
By inverting the matrix, one may obtained the desired 30 degrees rotation
| %test-reech-pnm greg-rmn.pgm greg-rmn-reech2.ppm -mat matrix.example -inv |
![]() |
| Interpolation using the nearest value | |
|---|---|
| Command lines as the same as above except that the option -nearest has been added | |
![]() |
![]() |
This option is quite useful when one want to resample labels images (see example in the connected components page).
| Initial image | |
|---|---|
![]() |
![]() |
| Linear resampling | |
| New grey levels appear at borders | |
![]() |
![]() |
| Nearest neighbor resampling | |
| Only the original grey levels are used | |
![]() |
![]() |
Available through anonymous FTP for non-commercial uses only.