Leptonica 1.68
C Image Processing Library

shear.c File Reference

Image shear about arbitrary lines and special points. More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "allheaders.h"

Go to the source code of this file.

Defines

#define DEBUG   0

Functions

static l_float32 normalizeAngleForShear (l_float32 radang, l_float32 mindif)
PIXpixHShear (PIX *pixd, PIX *pixs, l_int32 liney, l_float32 radang, l_int32 incolor)
PIXpixVShear (PIX *pixd, PIX *pixs, l_int32 linex, l_float32 radang, l_int32 incolor)
PIXpixHShearCorner (PIX *pixd, PIX *pixs, l_float32 radang, l_int32 incolor)
PIXpixVShearCorner (PIX *pixd, PIX *pixs, l_float32 radang, l_int32 incolor)
PIXpixHShearCenter (PIX *pixd, PIX *pixs, l_float32 radang, l_int32 incolor)
PIXpixVShearCenter (PIX *pixd, PIX *pixs, l_float32 radang, l_int32 incolor)
l_int32 pixHShearIP (PIX *pixs, l_int32 liney, l_float32 radang, l_int32 incolor)
l_int32 pixVShearIP (PIX *pixs, l_int32 linex, l_float32 radang, l_int32 incolor)
PIXpixHShearLI (PIX *pixs, l_int32 liney, l_float32 radang, l_int32 incolor)
PIXpixVShearLI (PIX *pixs, l_int32 linex, l_float32 radang, l_int32 incolor)

Variables

static const l_float32 MIN_DIFF_FROM_HALF_PI = 0.04

Detailed Description

Image shear about arbitrary lines and special points.

  About arbitrary lines
         PIX      *pixHShear()
         PIX      *pixVShear()

  About special 'points': UL corner and center
         PIX      *pixHShearCorner()
         PIX      *pixVShearCorner()
         PIX      *pixHShearCenter()
         PIX      *pixVShearCenter()

  In place about arbitrary lines
         l_int32   pixHShearIP()
         l_int32   pixVShearIP()

  Linear interpolated shear about arbitrary lines
         PIX      *pixHShearLI()
         PIX      *pixVShearLI()

  Static helper
    static l_float32  normalizeAngleForShear()

Definition in file shear.c.


Define Documentation

#define DEBUG   0

Definition at line 55 of file shear.c.


Function Documentation

static l_float32 normalizeAngleForShear ( l_float32  radang,
l_float32  mindif 
) [static]

Definition at line 783 of file shear.c.

References L_WARNING, and PROCNAME.

Referenced by pixHShear(), pixHShearIP(), pixHShearLI(), pixVShear(), pixVShearIP(), and pixVShearLI().

PIX* pixHShear ( PIX pixd,
PIX pixs,
l_int32  liney,
l_float32  radang,
l_int32  incolor 
)

pixHShear()

Input: pixd (<optional>, this can be null, equal to pixs, or different from pixs) pixs (no restrictions on depth) liney (location of horizontal line, measured from origin) angle (in radians) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK); Return: pixd, always

Notes: (1) There are 3 cases: (a) pixd == null (make a new pixd) (b) pixd == pixs (in-place) (c) pixd != pixs (2) For these three cases, use these patterns, respectively: pixd = pixHShear(NULL, pixs, ...); pixHShear(pixs, pixs, ...); pixHShear(pixd, pixs, ...); (3) This shear leaves the horizontal line of pixels at y = liney invariant. For a positive shear angle, pixels above this line are shoved to the right, and pixels below this line move to the left. (4) With positive shear angle, this can be used, along with pixVShear(), to perform a cw rotation, either with 2 shears (for small angles) or in the general case with 3 shears. (5) Changing the value of liney is equivalent to translating the result horizontally. (6) This brings in 'incolor' pixels from outside the image. (7) For in-place operation, pixs cannot be colormapped, because the in-place operation only blits in 0 or 1 bits, not an arbitrary colormap index. (8) The angle is brought into the range [-pi, -pi]. It is not permitted to be within MIN_DIFF_FROM_HALF_PI radians from either -pi/2 or pi/2.

Definition at line 100 of file shear.c.

References ERROR_PTR, L_ABS, L_BRING_IN_BLACK, L_BRING_IN_WHITE, L_SIGN, MIN_DIFF_FROM_HALF_PI, normalizeAngleForShear(), NULL, PIX_SRC, pixCopy(), pixCreateTemplate(), pixGetColormap(), pixGetDimensions(), pixHShearIP(), pixRasterop(), pixResizeImageData(), pixSetBlackOrWhite(), and PROCNAME.

Referenced by main(), pixHShearCenter(), pixHShearCorner(), pixRotate2Shear(), pixRotate3Shear(), and shearTest().

PIX* pixVShear ( PIX pixd,
PIX pixs,
l_int32  linex,
l_float32  radang,
l_int32  incolor 
)

pixVShear()

Input: pixd (<optional>, this can be null, equal to pixs, or different from pixs) pixs (no restrictions on depth) linex (location of vertical line, measured from origin) angle (in radians; not too close to +-(pi / 2)) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK); Return: pixd, or null on error

Notes: (1) There are 3 cases: (a) pixd == null (make a new pixd) (b) pixd == pixs (in-place) (c) pixd != pixs (2) For these three cases, use these patterns, respectively: pixd = pixVShear(NULL, pixs, ...); pixVShear(pixs, pixs, ...); pixVShear(pixd, pixs, ...); (3) This shear leaves the vertical line of pixels at x = linex invariant. For a positive shear angle, pixels to the right of this line are shoved downward, and pixels to the left of the line move upward. (4) With positive shear angle, this can be used, along with pixHShear(), to perform a cw rotation, either with 2 shears (for small angles) or in the general case with 3 shears. (5) Changing the value of linex is equivalent to translating the result vertically. (6) This brings in 'incolor' pixels from outside the image. (7) For in-place operation, pixs cannot be colormapped, because the in-place operation only blits in 0 or 1 bits, not an arbitrary colormap index. (8) The angle is brought into the range [-pi, -pi]. It is not permitted to be within MIN_DIFF_FROM_HALF_PI radians from either -pi/2 or pi/2.

Definition at line 215 of file shear.c.

References ERROR_PTR, L_ABS, L_BRING_IN_BLACK, L_BRING_IN_WHITE, L_SIGN, MIN_DIFF_FROM_HALF_PI, normalizeAngleForShear(), NULL, PIX_SRC, pixCopy(), pixCreateTemplate(), pixGetColormap(), pixGetDimensions(), pixRasterop(), pixResizeImageData(), pixSetBlackOrWhite(), pixVShearIP(), and PROCNAME.

Referenced by main(), pixRotate2Shear(), pixRotate3Shear(), pixVShearCenter(), pixVShearCorner(), and shearTest().

PIX* pixHShearCorner ( PIX pixd,
PIX pixs,
l_float32  radang,
l_int32  incolor 
)

pixHShearCorner()

Input: pixd (<optional>, if not null, must be equal to pixs) pixs angle (in radians) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK); Return: pixd, or null on error.

Notes: (1) See pixHShear() for usage. (2) This does a horizontal shear about the UL corner, with (+) shear pushing increasingly leftward (-x) with increasing y.

Definition at line 311 of file shear.c.

References ERROR_PTR, pixHShear(), and PROCNAME.

PIX* pixVShearCorner ( PIX pixd,
PIX pixs,
l_float32  radang,
l_int32  incolor 
)

pixVShearCorner()

Input: pixd (<optional>, if not null, must be equal to pixs) pixs angle (in radians) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK); Return: pixd, or null on error.

Notes: (1) See pixVShear() for usage. (2) This does a vertical shear about the UL corner, with (+) shear pushing increasingly downward (+y) with increasing x.

Definition at line 340 of file shear.c.

References ERROR_PTR, pixVShear(), and PROCNAME.

Referenced by pixFindSkewSweep(), and pixFindSkewSweepAndSearchScorePivot().

PIX* pixHShearCenter ( PIX pixd,
PIX pixs,
l_float32  radang,
l_int32  incolor 
)

pixHShearCenter()

Input: pixd (<optional>, if not null, must be equal to pixs) pixs angle (in radians) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK); Return: pixd, or null on error.

Notes: (1) See pixHShear() for usage. (2) This does a horizontal shear about the center, with (+) shear pushing increasingly leftward (-x) with increasing y.

Definition at line 369 of file shear.c.

References ERROR_PTR, pixGetHeight(), pixHShear(), and PROCNAME.

PIX* pixVShearCenter ( PIX pixd,
PIX pixs,
l_float32  radang,
l_int32  incolor 
)

pixVShearCenter()

Input: pixd (<optional>, if not null, must be equal to pixs) pixs angle (in radians) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK); Return: pixd, or null on error.

Notes: (1) See pixVShear() for usage. (2) This does a vertical shear about the center, with (+) shear pushing increasingly downward (+y) with increasing x.

Definition at line 398 of file shear.c.

References ERROR_PTR, pixGetWidth(), pixVShear(), and PROCNAME.

Referenced by pixFindSkewSweepAndSearchScorePivot().

l_int32 pixHShearIP ( PIX pixs,
l_int32  liney,
l_float32  radang,
l_int32  incolor 
)

pixHShearIP()

Input: pixs liney (location of horizontal line, measured from origin) angle (in radians) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK); Return: 0 if OK; 1 on error

Notes: (1) This is an in-place version of pixHShear(); see comments there. (2) This brings in 'incolor' pixels from outside the image. (3) pixs cannot be colormapped, because the in-place operation only blits in 0 or 1 bits, not an arbitrary colormap index. (4) Does a horizontal full-band shear about the line with (+) shear pushing increasingly leftward (-x) with increasing y.

Definition at line 434 of file shear.c.

References ERROR_INT, L_ABS, L_BRING_IN_BLACK, L_BRING_IN_WHITE, L_SIGN, MIN_DIFF_FROM_HALF_PI, normalizeAngleForShear(), NULL, pixGetColormap(), pixGetDimensions(), pixRasteropHip(), and PROCNAME.

Referenced by main(), pixAffineSequential(), pixHShear(), pixRotateShearIP(), and shearTest().

l_int32 pixVShearIP ( PIX pixs,
l_int32  linex,
l_float32  radang,
l_int32  incolor 
)

pixVShearIP()

Input: pixs (all depths; not colormapped) linex (location of vertical line, measured from origin) angle (in radians) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK); Return: 0 if OK; 1 on error

Notes: (1) This is an in-place version of pixVShear(); see comments there. (2) This brings in 'incolor' pixels from outside the image. (3) pixs cannot be colormapped, because the in-place operation only blits in 0 or 1 bits, not an arbitrary colormap index. (4) Does a vertical full-band shear about the line with (+) shear pushing increasingly downward (+y) with increasing x.

Definition at line 504 of file shear.c.

References ERROR_INT, L_ABS, L_BRING_IN_BLACK, L_BRING_IN_WHITE, L_SIGN, MIN_DIFF_FROM_HALF_PI, normalizeAngleForShear(), NULL, pixGetColormap(), pixGetDimensions(), pixRasteropVip(), and PROCNAME.

Referenced by main(), pixAffineSequential(), pixRotateShearIP(), pixVShear(), and shearTest().

PIX* pixHShearLI ( PIX pixs,
l_int32  liney,
l_float32  radang,
l_int32  incolor 
)

pixHShearLI()

Input: pixs (8 bpp or 32 bpp, or colormapped) liney (location of horizontal line, measured from origin) angle (in radians, in range (-pi/2 ... pi/2)) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK); Return: pixd (sheared), or null on error

Notes: (1) This does horizontal shear with linear interpolation for accurate results on 8 bpp gray, 32 bpp rgb, or cmapped images. It is relatively slow compared to the sampled version implemented by rasterop, but the result is much smoother. (2) This shear leaves the horizontal line of pixels at y = liney invariant. For a positive shear angle, pixels above this line are shoved to the right, and pixels below this line move to the left. (3) Any colormap is removed. (4) The angle is brought into the range [-pi/2 + del, pi/2 - del], where del == MIN_DIFF_FROM_HALF_PI.

Definition at line 582 of file shear.c.

References composeRGBPixel(), ERROR_PTR, GET_DATA_BYTE, L_BLUE_SHIFT, L_BRING_IN_BLACK, L_BRING_IN_WHITE, L_GREEN_SHIFT, L_RED_SHIFT, MIN_DIFF_FROM_HALF_PI, normalizeAngleForShear(), NULL, pixClone(), pixCopy(), pixCreateTemplate(), pixDestroy(), pixGetColormap(), pixGetData(), pixGetDepth(), pixGetDimensions(), pixGetWpl(), pixRemoveColormap(), pixSetBlackOrWhite(), PROCNAME, REMOVE_CMAP_BASED_ON_SRC, and SET_DATA_BYTE.

Referenced by main(), pixWarpStereoscopic(), and shearTest().

PIX* pixVShearLI ( PIX pixs,
l_int32  linex,
l_float32  radang,
l_int32  incolor 
)

pixVShearLI()

Input: pixs (8 bpp or 32 bpp, or colormapped) linex (location of vertical line, measured from origin) angle (in radians, in range (-pi/2 ... pi/2)) incolor (L_BRING_IN_WHITE, L_BRING_IN_BLACK); Return: pixd (sheared), or null on error

Notes: (1) This does vertical shear with linear interpolation for accurate results on 8 bpp gray, 32 bpp rgb, or cmapped images. It is relatively slow compared to the sampled version implemented by rasterop, but the result is much smoother. (2) This shear leaves the vertical line of pixels at x = linex invariant. For a positive shear angle, pixels to the right of this line are shoved downward, and pixels to the left of the line move upward. (3) Any colormap is removed. (4) The angle is brought into the range [-pi/2 + del, pi/2 - del], where del == MIN_DIFF_FROM_HALF_PI.

Definition at line 692 of file shear.c.

References composeRGBPixel(), ERROR_PTR, GET_DATA_BYTE, L_BLUE_SHIFT, L_BRING_IN_BLACK, L_BRING_IN_WHITE, L_GREEN_SHIFT, L_RED_SHIFT, MIN_DIFF_FROM_HALF_PI, normalizeAngleForShear(), NULL, pixClone(), pixCopy(), pixCreateTemplate(), pixDestroy(), pixGetColormap(), pixGetData(), pixGetDepth(), pixGetDimensions(), pixGetWpl(), pixRemoveColormap(), pixSetBlackOrWhite(), PROCNAME, REMOVE_CMAP_BASED_ON_SRC, and SET_DATA_BYTE.

Referenced by main(), and shearTest().


Variable Documentation

const l_float32 MIN_DIFF_FROM_HALF_PI = 0.04 [static]

Definition at line 49 of file shear.c.

Referenced by pixHShear(), pixHShearIP(), pixHShearLI(), pixVShear(), pixVShearIP(), and pixVShearLI().

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines