Changes between Version 5 and Version 6 of DevWikiAffineParameters
- Timestamp:
- 09/13/11 10:58:24 (13 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
DevWikiAffineParameters
v5 v6 61 61 62 62 1. scaling 63 1. clockwise rotation 63 1. clockwise rotation around the origin 64 64 1. shearing parallel to the x axis 65 65 1. shearing parallel to the y axis … … 88 88 [[Image(aggregate_usage.png)]] 89 89 90 * x' = o,,11,, x + o,,12,, y 91 * y' = o,,21,, x + o,,22,, y 90 92 93 == Constructing the affine transformation == 91 94 92 Sx : scale in the x direction 93 Sy : scale in the y direction 94 Tx : translation in the x direction 95 Ty : translation in the y direction 96 Kx : shearing parallel to x axis 97 Ky : shearing parallel to y axis 98 theta : angle of rotation CLOCKWISE around the origin (not around the 99 x axis, not around the y axis: around the origin; or if you like, 100 around the invisible Z axis coming out of the screen and poking you in 101 the eye.) 95 The 2x2 matrix '''O''' is the upper-left hand corner of the affine transformation, which is the 3x3 matrix, '''A'''. The right hand column contains the offsets, or translation, of the raster in the x and y directions. The bottom row is always filled with the numbers 0, 0, 1. The result of this is that there are six parameters to an affine transformation which can actually change, as shown: 102 96 103 The next step is to define an order. I chose: "Scale followed by 104 rotation followed by shearing (skew)". 97 [[Image(affinematrix.png)]] 105 98 106 Multiplying these matrices together, as described here 107 (http://en.wikipedia.org/wiki/Transformation_matrix#Composing_and_inverting_transformations) 108 gives a 2x2 matrix, which is not an affine transform yet. Let's label 109 the coefficients of this matrix as follows 99 * a,,11,, = o,,11,, = s,,x,, ( (1 + k,,x,, k,,y,,) cosθ + k,,y,, sinθ ) 100 * a,,12,, = o,,12,, = s,,x,, ( k,,x,, cosθ + sinθ ) 101 * a,,13,, = t,,x,, 102 * a,,21,, = o,,21,, = s,,y,, ( -(1 + k,,x,, k,,y,,) sinθ + k,,y,, cosθ ) 103 * a,,22,, = o,,22,, = s,,y,, ( - k,,x,, sinθ + cosθ ) 104 * a,,23,, = t,,y,, 110 105 111 | O11 O12 | 112 | O21 O22 | 106 where: 107 * s,,x,, : scale factor in x direction 108 * s,,y,, : scale factor in y direction 109 * t,,x,, : offset in x direction 110 * t,,y,, : offset in y direction 111 * θ : angle of rotation clockwise around origin 112 * k,,x,, : shearing parallel to x axis 113 * k,,y,, : shearing parallel to y axis 113 114 114 (I apologize for the ascii graphics throughout. Gmail is not using a 115 monospaced font even in "plain text" mode.) 115 It is these six parameters (a,,11,,...a,,23,,)which are typically stored within a geospatial image file format to record the conversion from pixel index to geolocation. The actual conversion is described as follows: 116 116 117 So what I get for these coefficients (after multiplying in the order 118 specified) is: 117 [[Image(affineusage.png)]] 119 118 120 O11 = Sx * (cos(theta) + Ky sin(theta)) 121 O12 = Sx * (Kx cos(theta) + sin(theta)) 122 O21 = Sy * (-sin(theta) + Ky cos(theta)) 123 O22 = Sy * (-Kx * sin(theta) + cos(theta)) 119 * E = a,,11,, i + a,,12,, j + a,,13,, 120 * N = a,,21,, i + a,,22,, j + a,,23,, 124 121 125 And the final bit is to add translation by making this into an affine transform: 122 where E is easting, N is northing, i is pixel column and j is pixel row. The last row of the matrix equation is always ignored, as it boils down to 1=1. It is there to make a square matrix used to calculate the inverse operation. 126 123 127 | O11 O12 O13 | 128 | O21 O22 O23 | 129 | 0 0 1 | 124 == Link to postgis raster == 130 125 131 where: 126 The six parameters of the affine transform are given the following names in postgis raster: 132 127 133 O13 = Tx 134 O23 = Ty 128 * ScaleX = a,,11,, 129 * SkewX = a,,12,, 130 * OffsetX = a,,13,, = t,,x,, 131 * SkewY = a,,21,, 132 * ScaleY = a,,22,, 133 * OffsetY = a,,23,, = t,,y,, 135 134 136 To be pedantic, this is used as follows: 135 With the exception of OffsetX and OffsetY, the names are somewhat arbitrary for the general case. 137 136 138 | E | | O11 O12 O13 | | i | 139 | N | = | O21 O22 O23 | | j | 140 | 1 | | 0 0 1 | | 1 | 137 == Summary == 141 138 142 where: 143 E = easting 144 N = northing 145 i = pixel column 146 j = pixel row 147 148 149 The coefficients map onto our jumbled named coefficients as follows : 150 151 ScaleX = O11 152 SkewX = O12 153 OffsetX = O13 154 SkewY = O21 155 ScaleY = O22 156 OffsetY = O23 157 158 The important thing to note is that the things we're rather loosely 159 calling Scale[XY] and Skew[XY] represent all of Scale, Rotation and 160 Shearing. This dictates that you cannot set these coefficients without 161 knowing all three. 139 Throughout this page, the following symbols have been