man > pamhomography(1)

pamhomography(1)                       General Commands Manual                      pamhomography(1)

<script  type="text/javascript"  src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
<script  type="text/javascript"  id="MathJax-script"  async  src="https://cdn.jsdelivr.net/npm/math‐
jax@3/es5/tex-mml-chtml.js"></script>

NAME
       pamhomography - stretch/shrink a quadrilateral region of an image to
         another quadrilateral shape



SYNOPSIS
       pamhomography
         [-from=coords]
         [-to=coords]
         [-mapfile=map_file]
         [-view=coords]
         [-fill=color]
         [-verbose
         [pam_file]

       You  can abbreviate any option to its shortest unique prefix. You can use two hyphens instead
       of one to delimit an option. You can separate an option from its value  with  whitespace  in‐
       stead of =.



DESCRIPTION
       This program is part of ]8;;http://netpbm.sourceforge.net/\Netpbm]8;;\ .

       pamhomography  stretches and shrinks an arbitrary quadrilateral portion of an input image you
       specify (not necessarily rectangular), into a new quadrilateral shape you specify,  producing
       a new image.

       You  can do any ]8;;https://en.wikipedia.org/wiki/Affine_transformation#Image_transformation\affine image transformation]8;;\ : translation, reflection, scaling, rotation, and
       shearing/skewing. However, pamhomography additionally can do bilinear transforms, which means
       it can warp any quadrilateral to any other quadrilateral, even when this  mapping  cannot  be
       described using a single set of linear equations. This can be useful, for example, for creat‐
       ing perspective views of rectangular images or for reverse-mapping a perspective view back to
       a rectangular projection.



OPTIONS
       In  addition  to  the options common to all programs based on libnetpbm (most notably -quiet,
       see ]8;;index.html#commonoptions\Common Options]8;;\ ), pamhomography recognizes the following command line options:




       -from=coords

              This defines the source quadrilateral. coords is a list of four
                integer-valued (x, y) coordinates. If you do not specify the
                source with either -from or -mapfile, the source quadrilateral
                is the entire input image.



       -to=coords

              This defines the target quadrilateral. coords is a list of four integer-valued (x,  y)
              coordinates.  If you do not specify the target with either -to or -mapfile, the target
              quadrilateral is the same as the entire input image.


       -mapfile=map_file

              This names a text file that describes the  mapping  from  the  source  to  the  target
              quadrilateral. The file map_file must contain either eight integer-valued (x, y) coor‐
              dinates,  being  the four source coordinates followed by the corresponding four target
              coordinates, or only four (x, y) coordinates, being only the four target  coordinates.
              In  the  latter  case, the source quadrilateral is taken to be the four corners of the
              input image in clockwise order, starting from the upper left.

              Anything you specify with -to or -from overrides what is in
                this file.



       -view=coords

              This defines the target view. coords is a list of two integer-valued  (x,  y)  coordi‐
              nates:  the  upper  left  and lower right boundaries, respectively, of the pixels that
              will be visible in the output image. If -view is not specified, the target  view  will
              fit precisely the target quadrilateral.



       -fill=color

              This is the color with which the program fills all pixels that lie outside of the tar‐
              get quadrilateral. Specify the color as described for the ]8;;libnetpbm_image.html#colorname\ argument of the pnm_parsec‐
              olor() library routine]8;;\ .

              The default is black, and for images with a transparency plane, transparent.




       -verbose
              This makes the program issue some informational messages about what it is doing.



       Cooordinates  should normally be specified in clockwise order. The syntax is fairly flexible:
       all characters other than the plus sign, minus sign, and digits are  treated  as  separators.
       Although coordinates need to be integers, they may lie outside the image's boundary.


PARAMETERS
       pamhomography's only parameter, pam_file, is the name of the
         file containing the input image. If you don't specify pam_file, the
         image comes from Standard Input.



NOTES
       The output image uses the same Netpbm format as the input image.

       Simple transformations are best handled by other Netpbm programs, such as those listed in the
       ]8;;#SEE-ALSO\'SEE ALSO']8;;\    section below. Use pamhomography for more sophisticated transformations such as
       perspective adjustments, rotations around an arbitrary point in the image, extraction of non-
       rectangular quadrilaterals, shearings by coordinates rather than by angle, and,  in  general,
       all  transformations  that  are  most easily expressed as mapping four points in one image to
       four points in another image.


EXAMPLES
       The following examples use the ]8;;park_row.ppm\park_row.ppm]8;;\  test image, which is  a  ]8;;https://commons.wikimedia.org/wiki/File:15_Park_Row_3.JPG\ photograph of New York
       City's Park Row Building]8;;\  ,  scaled to 441&times;640, converted to a PPM file, and redistrib‐
       uted under the terms of the ]8;;https://en.wikipedia.org/wiki/GNU_Free_Documentation_License\ GFDL]8;;\ .

       The  first  example  showcases  the  real  power  of  bilinear   transformations.    Assuming
       park_row_rect.map has the following contents:

             (0,  0) (440,   0) (440, 639)  (0, 639)

       then


       projects the building's facade from a perspective view to a rectilinear front-on view. Remem‐
       ber  that  pamhomography  ignores  the parentheses and commas used in park_row_rect.map; they
       merely make the file more human-readable. We equivalently could have written


       or any of myriad other variations.

       pamhomography can warp the image to a trapezoid to make it look like it's  leaning  backwards
       in 3-D:


       As a very simple example,


       flips  the image left-to-right. Note that in this case the target quadrilateral's coordinates
       are listed in counterclockwise order  because  that  represents  the  correspondence  between
       points (0, 0) &harr; (440, 0) and (0, 639) &harr; (639, 0).

       Scaling   is  also  straightforward.  The  following  command  scales  down  the  image  from
       441&times;640 to 341&times;540:


       Let's add 100 pixels of tan border to the above. We use -view and -fill  to  accomplish  that
       task:


       We can add a border without having to scale the image:


       The -view option can also be used to extract a rectangle out of an image, discarding the rest
       of the image:


       Specifying  the  same set of coordinates to -from and -to has the same effect but also allows
       you to extract non-rectangular quadrilaterals from an image:


       Rotation is doable but takes some effort. The challenge is that you need to compute  the  ro‐
       tated  coordinates  yourself.  The  matrix expression to rotate points \((x_1, y_1)\) \((x_2,
       y_2)\), \((x_3, y_3)\), and \((x_4, y_4)\)  clockwise  by  \(\theta\)  degrees  around  point
       \((c_x, c_y)\) is

       \[ \begin{bmatrix} 1 & 0 & c_x \\ 0 & 1 & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \cos
       \theta  &  -\sin  \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \be‐
       gin{bmatrix} 1 & 0 & -c_x \\ 0 & 1 & -c_y \\ 0 & 0 & 1 \end{bmatrix}  \begin{bmatrix}  x_1  &
       x_2 & x_3 & x_4 \\ y_1 & y_2 & y_3 & y_4 \\ 1 & 1 & 1 & 1 \end{bmatrix} \quad. \]

       For example, to rotate park_row.ppm 30&deg; clockwise around (220, 320) you would compute

       \[ \begin{bmatrix} 1 & 0 & 220 \\ 0 & 1 & 320 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \cos
       30^{\circ}  &  -\sin  30^{\circ}  &  0  \\ \sin 30^{\circ} & \cos 30^{\circ} & 0 \\ 0 & 0 & 1
       \end{bmatrix} \begin{bmatrix} 1 & 0 & -220 \\ 0 & 1 & -320 \\ 0 & 0 &  1  \end{bmatrix}  \be‐
       gin{bmatrix}  0  &  440  & 440 & 0 \\ 0 & 0 & 639 & 639 \\ 1 & 1 & 1 & 1 \end{bmatrix} = \be‐
       gin{bmatrix} 189.4744 & 570.5256 & 251.0256 & -130.0256 \\ -67.1281 & 152.8719 &  706.2621  &
       486.2621 \\ 1.0000 & 1.0000 & 1.0000 & 1.0000 \end{bmatrix} \quad, \]

       round  these  coordinates  to  integers,  transpose the matrix, and produce the following map
       file, park_row_rot30.map:

            571  153
            251  706
           -130  486

       (These are the 'to' coordinates; we use the default, full-image 'from' coordinates.) The map‐
       ping then works as in all of the preceding examples:




SEE ALSOpamcut(1)pamenlarge(1)pamflip(1)pamperspective(1)pamscale(1)pamstretch(1)pam(1)pnmmargin(1)pnmpad(1)pnmrotate(1)pnmshear(1)




HISTORY
       pamhomography was new in Netpbm 10.94 (March 2021).



AUTHOR
       Copyright © 2020 Scott Pakin, scott+pbm AT pakin.org



Table of Contents
       •

              ]8;;#SYNOPSIS\SYNOPSIS]8;;\

       •

              ]8;;#DESCRIPTION\DESCRIPTION]8;;\

       •

              ]8;;#OPTIONS\OPTIONS]8;;\

       •

              ]8;;#PARAMETERS\PARAMETERS]8;;\

       •

              ]8;;#NOTES\NOTES]8;;\

       •

              ]8;;#EXAMPLES\EXAMPLES]8;;\

       •

              ]8;;#SEE-ALSO\SEE ALSO]8;;\

       •

              ]8;;#HISTORY\HISTORY]8;;\

       •

              ]8;;#AUTHOR\AUTHOR]8;;\

DOCUMENT SOURCE
       This manual page was generated by the Netpbm tool 'makeman' from  HTML  source.   The  master
       documentation is at

              http://netpbm.sourceforge.net/doc/pamhomography.html

netpbm documentation                      04 December 2022                          pamhomography(1)
pamhomography(1)
NAME SYNOPSIS
pamhomography
DESCRIPTION OPTIONS
-from=coords -to=coords -mapfile=map_file -view=coords -fill=color -verbose
PARAMETERS NOTES EXAMPLES SEE ALSO HISTORY AUTHOR Table of Contents DOCUMENT SOURCE

Generated by phpman v4.9.26-5-g7740029 · Markdown · JSON · MCP Author: Che Dong Under GNU General Public License
2026-08-13 00:46 @216.73.217.60
CrawledBy Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
Valid XHTML 1.0 Transitional!Valid CSS!

^_top_^