summary refs log tree commit diff
path: root/pamrubber.html
blob: 1bdcf24dccbf4d6e85e6a750c7ad39e80fd0374a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.3//EN">
<html><head><title>Pamrubber User Manual</title></head>
<body>
<h1>pamrubber</h1>
Updated: February 2011
<br>
<a href="#index">Table Of Contents</a>

<h2>NAME</h2>
pamrubber - a rubber-sheeting utility that stretches an image
based on control points

<h2 id="synopsis">SYNOPSIS</h2>
<b>pamrubber</b>
{<b>-tri | -quad</b>}
[<b>-linear</b>]
[<b>-frame</b>]
[<b>-randomseed=</b><i>N</i>]
<i>cp1x cp1y</i> [<i>cp2x cp2y</i> [<i>cp3x cp3y</i> [<i>cp4x cp4y</i>]]]
<i>cp1x cp1y</i> [<i>cp2x cp2y</i> [<i>cp3x cp3y</i> [<i>cp4x cp4y</i>]]]
[<i>filename</i>]

<p>Minimum unique abbreviation of options is acceptable.  You may use double
hyphens instead of single hyphen to denote options.

<h2 id="description">DESCRIPTION</h2>

<p>This program is part of <a href="index.html">Netpbm</a>.

<p>The <b>pamrubber</b> utility converts a pam image into a new image with the
contents moved around.  The transformation is often called "rubber
sheeting": you identify control points (CP) on the source image and
specify new positions for those points in the new image.  <b>pamrubber</b>
moves all the pixels around, stretching and compressing as necessary, as
if the original image were on a sheet of rubber and you pulled on the sheet
to make the control points move to their new locations.

<p>The new image has the same dimensions and format as the original.

<p>The transformation can happen in two very different ways, called
"quad" and "tri." With the former, you must specify four
control points (for both source and target).  These are the corners of two
quadrilaterals that will act as the coordinate system for both source and
target images.  Consider them as non-orthogonal (0,0), (0,1), (1,0) and (1,1)
points.  This transformation comes close to the one <b>pamperspective</b>
does, however that program does other corrections as well.

<p>When you specify less than four control points, the program adds control
points in the following way.  With three control points, <b>pamrubber</b>
chooses the fourth one such that the four points form a parallelogram.  With
two points, <b>pamrubber</b> considers them the opposite corners of a
rectangle.  When you specify only one control point, <b>pamrubber</b> uses a
rectangle from the top left corner of the image to the single control
point.

<p>In "tri" mode, <b>pamrubber</b> conceptually cuts up the source
and target image into triangles.  It Transforms within each corresponding pair
of triangles in a stretching fashion.  It's like pulling on the three corners
of the triangle.  In this mode, each pixel in the source image gets mapped to
a position in the target image. No pixels are lost.

<p>When, in "tri" mode, you specify only a single control point in
the source and target image, <b>pamrubber</b> creates four triangles from this
point to the four corners of the image. With two points, the program creates
six triangles from the two endpoints of the line connecting the two points,
again to the four corners of the image. Three control points is in a way the
core of this utility in "tri" mode.  Between the three edges of the
central triangle and the four edges of the image, <b>pamrubber</b> constructs
another seven triangles.  Four control points define two central connected
triangles.  In total this results in cutting the source and target image up
into ten triangles.

<p>In this case clearly a picture says more than a thousand words.  There is a
graphical illustration of these various modes at
<a href="http://www.schaik.com/netpbm/rubber">
www.schaik.com/netpbm/rubber</a>.  An example of how to use this type of
rubber sheeting in cartography is in the article
<a href="http://www.isprs.org/proceedings/XXXVI/5-W1/papers/21.pdf">
Visualizing the Landscape of Old-Time Tokyo</a>.


<h2 id="parameters">PARAMETERS</h2>

<p>The parameters are control points (<i>cp</i>) in pairs of <i>x</i>
and <i>y</i>.  The source and target image must have the same number of
control points.  The minimum number of values specified here is 4 for a single
control point in the source and target image.  The maximum is 16 for four
control points in each image.


<p><i>filename</i> is the name of the input file. If you don't specify
this, <b>pamrubber</b> reads the image from Standard Input.


<h2 id="options">OPTIONS</h2>

<p>In addition to the options common to all programs based on libnetpbm
(most notably <b>-quiet</b>, see <a href="index.html#commonoptions">
Common Options</a>), <b>pamrubber</b> recognizes the following
command line options:

<dl compact>

<dt><b>-tri</b> | <b>-quad</b></dt>
<dd>
<p>This selects the type of rubber sheeting done.
You must specify exactly one of these options.
</dd>

<dt><b>-linear</b></dt>
<dd>
<p>This determines whether <b>pamrubber</b> uses nearest neighbor
interpolation or bilinear interpolation of four source pixels.

</dd>

<dt><b>-frame</b></dt>
<dd>
<p>This option causes <b>pamrubber</b> to overlay the target image with the
edges of the quadrilaterals, respectively the triangles used for the rubber
sheeting.  To get the same overlay for the source image, use a <b>pamrubber</b>
transformation with identical control points for source and target.
</dd>

<dt><b>-randomseed=</b><i>N</i></dt>
<dd>
<p><b>pamrubber</b> randomizes some of its output.  So that you can produce
repeatable results, you can choose the seed of the random number generator
with this option.  If you use the same input image and the same random number
generator seed, you should always get the exact same output.  By default,
<b>pamrubber</b> uses the time of day as the seed, so you get slightly
different output when you run the program twice on the same input.

<p>Before Netpbm 10.61 (December 2012), this was called <b>-randseed</b>,
and that still works.

</dd>

</dl>

<h2 id="seealso">SEE ALSO</h2>
<b><a href="pam.html">pam</a></b> and
<b><a href="pamperspective.html">pamperspective</a></b>

<h2 id="history">HISTORY</h2>
<p><b>pamrubber</b> was new in Netpbm 10.54 (March 2011).


<h2 id="authors">AUTHORS</h2>

<p><a href="mailto:willem@schaik.com">Willem van Schaik</a> wrote this program
in February 2011 and contributed it to Netpbm.

<br>
<hr>

<h2 id="index">Table Of Contents</h2>
<ul>
<li><a href="#synopsis">SYNOPSIS</a>
<li><a href="#description">DESCRIPTION</a>
<li><a href="#parameters">PARAMETERS</a>
<li><a href="#options">OPTIONS</a>
<li><a href="#seealso">SEE ALSO</a>
<li><a href="#history">HISTORY</a>
<li><a href="#authors">AUTHORS</a>
</ul>
</body>
</html>