#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "allheaders.h"
Функции | |
PIX * | pixBilinearSampledPta (PIX *pixs, PTA *ptad, PTA *ptas, l_int32 incolor) |
PIX * | pixBilinearSampled (PIX *pixs, l_float32 *vc, l_int32 incolor) |
PIX * | pixBilinearPta (PIX *pixs, PTA *ptad, PTA *ptas, l_int32 incolor) |
PIX * | pixBilinear (PIX *pixs, l_float32 *vc, l_int32 incolor) |
PIX * | pixBilinearPtaColor (PIX *pixs, PTA *ptad, PTA *ptas, l_uint32 colorval) |
PIX * | pixBilinearColor (PIX *pixs, l_float32 *vc, l_uint32 colorval) |
PIX * | pixBilinearPtaGray (PIX *pixs, PTA *ptad, PTA *ptas, l_uint8 grayval) |
PIX * | pixBilinearGray (PIX *pixs, l_float32 *vc, l_uint8 grayval) |
l_int32 | getBilinearXformCoeffs (PTA *ptas, PTA *ptad, l_float32 **pvc) |
l_int32 | bilinearXformSampledPt (l_float32 *vc, l_int32 x, l_int32 y, l_int32 *pxp, l_int32 *pyp) |
l_int32 | bilinearXformPt (l_float32 *vc, l_int32 x, l_int32 y, l_float32 *pxp, l_float32 *pyp) |
Input: vc (vector of 8 coefficients) (x, y) (initial point) (&xp, &yp) (<return> transformed point) Return: 0 if OK; 1 on error
Notes: (1) This computes the floating point location of the transformed point. (2) It does not check ptrs for returned data!
l_int32 bilinearXformSampledPt | ( | l_float32 * | vc, | |
l_int32 | x, | |||
l_int32 | y, | |||
l_int32 * | pxp, | |||
l_int32 * | pyp | |||
) |
Input: vc (vector of 8 coefficients) (x, y) (initial point) (&xp, &yp) (<return> transformed point) Return: 0 if OK; 1 on error
Notes: (1) This finds the nearest pixel coordinates of the transformed point. (2) It does not check ptrs for returned data!
Input: ptas (source 4 points; unprimed) ptad (transformed 4 points; primed) &vc (<return> vector of coefficients of transform) Return: 0 if OK; 1 on error
We have a set of 8 equations, describing the bilinear transformation that takes 4 points (ptas) into 4 other points (ptad). These equations are:
x1' = c[0]*x1 + c[1]*y1 + c[2]*x1*y1 + c[3] y1' = c[4]*x1 + c[5]*y1 + c[6]*x1*y1 + c[7] x2' = c[0]*x2 + c[1]*y2 + c[2]*x2*y2 + c[3] y2' = c[4]*x2 + c[5]*y2 + c[6]*x2*y2 + c[7] x3' = c[0]*x3 + c[1]*y3 + c[2]*x3*y3 + c[3] y3' = c[4]*x3 + c[5]*y3 + c[6]*x3*y3 + c[7] x4' = c[0]*x4 + c[1]*y4 + c[2]*x4*y4 + c[3] y4' = c[4]*x4 + c[5]*y4 + c[6]*x4*y4 + c[7]
This can be represented as
AC = B
where B and C are column vectors
B = [ x1' y1' x2' y2' x3' y3' x4' y4' ] C = [ c[0] c[1] c[2] c[3] c[4] c[5] c[6] c[7] ]
and A is the 8x8 matrix
x1 y1 x1*y1 1 0 0 0 0 0 0 0 0 x1 y1 x1*y1 1 x2 y2 x2*y2 1 0 0 0 0 0 0 0 0 x2 y2 x2*y2 1 x3 y3 x3*y3 1 0 0 0 0 0 0 0 0 x3 y3 x3*y3 1 x4 y4 x4*y4 1 0 0 0 0 0 0 0 0 x4 y4 x4*y4 1
These eight equations are solved here for the coefficients C.
These eight coefficients can then be used to find the mapping (x,y) --> (x',y'):
x' = c[0]x + c[1]y + c[2]xy + c[3] y' = c[4]x + c[5]y + c[6]xy + c[7]
that are implemented in bilinearXformSampledPt() and bilinearXFormPt().
Input: pixs (all depths; colormap ok) vc (vector of 8 coefficients for affine transformation) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK) Return: pixd, or null on error
Notes: (1) Brings in either black or white pixels from the boundary (2) Removes any existing colormap, if necessary, before transforming
Input: pixs (32 bpp) vc (vector of 6 coefficients for affine transformation) colorval (e.g., 0 to bring in BLACK, 0xffffff00 for WHITE) Return: pixd, or null on error
Input: pixs (8 bpp) vc (vector of 8 coefficients for affine transformation) grayval (0 to bring in BLACK, 255 for WHITE) Return: pixd, or null on error
Input: pixs (all depths; colormap ok) ptad (4 pts of final coordinate space) ptas (4 pts of initial coordinate space) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK) Return: pixd, or null on error
Notes: (1) Brings in either black or white pixels from the boundary (2) Removes any existing colormap, if necessary, before transforming
Input: pixs (32 bpp) ptad (4 pts of final coordinate space) ptas (4 pts of initial coordinate space) colorval (e.g., 0 to bring in BLACK, 0xffffff00 for WHITE) Return: pixd, or null on error
Input: pixs (8 bpp) ptad (4 pts of final coordinate space) ptas (4 pts of initial coordinate space) grayval (0 to bring in BLACK, 255 for WHITE) Return: pixd, or null on error
Input: pixs (all depths) vc (vector of 8 coefficients for bilinear transformation) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK) Return: pixd, or null on error
Notes: (1) Brings in either black or white pixels from the boundary. (2) Retains colormap, which you can do for a sampled transform.. (3) For 8 or 32 bpp, much better quality is obtained by the somewhat slower pixBilinear(). See that function for relative timings between sampled and interpolated.
Input: pixs (all depths) ptad (4 pts of final coordinate space) ptas (4 pts of initial coordinate space) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK) Return: pixd, or null on error
Notes: (1) Brings in either black or white pixels from the boundary. (2) Retains colormap, which you can do for a sampled transform.. (3) No 3 of the 4 points may be collinear. (4) For 8 and 32 bpp pix, better quality is obtained by the somewhat slower pixBilinearPta(). See that function for relative timings between sampled and interpolated.