Viewing contents of file '../idllib/ssw/allpro/affine_solve.pro'
;==================================================
PRO AFFINE_SOLVE, xin, xpin, $
mx, my, sx, theta, xc, yc,$
VERBOSE=blab
;==================================================
;+
; NAME:
; AFFINE_SOLVE
;
; PURPOSE:
; Calculate the parameters of a general affine image
; transformation given a set of points from two images:
; one of the images is assumed to be the reference image,
; the other is assumed to be an image translated, rotated,
; scaled, and possibly sheared relative to the reference image.
;
; The form of the general transformation is affine:
; X = tranformed coordinates = [T+ M S R T-] X'
; where, in homogeneous coordinates,
;
; X = TRANSPOSE[x, y, 1]: test image vector
; T+ = [[1,0,x0],[0,1,y0],[0,0,1]]: translatation of (0,0) back to (x0,y0)
; M = [[mx,0,0],[0,my,0],[0,0,1]]:scale
; S = [[1,sx,0],[0,1,0],[0,0,1]]: horizontal shear
; R = [[cos(t),-sin(t),0],[sin(t),cos(t),0],[0,0,1]]:
; rotate clockwise by angle t about origin.
; T- = [[1,0,-x0],[0,1,-y0],[0,0,1]]:center of rotation to (0,0)
; X' = TRANSPOSE[x',y',1]: reference image vector
;
; CATEGORY:
; Z3 - Image processing, geometric transforms, image registration.
;
; CALLING SEQUENCE:
; AFFINE_SOLVE, xin,xrefin,sx,sy,s,theta,x0,y0
;
; INPUTS:
; XIN: 2xN dimensional array of points taken from image1
; which correspond to the same points in the reference image.
; Xi = XIN(0,*)
; Yi = XIN(1,*)
; N is the number of points.
;
; XPIN: 2xN dimensional array of points from the "reference image"
; which correspond to points in the image.
;
; KEYWORDS:
; VERBOSE: If set, print the transformation elements to the screen.
;
; OUTPUTS:
; MX, MY: Magnification factors in x and y axes, respectively.
;
; SX: Horizontal shearing factor.
;
; THETA: Rotation angle in degrees.
;
; XC,YC: Center of rotation vector elements OR translation
; vector elements.
;
; COMMON BLOCKS:
; None.
;
; SIDE EFFECTS:
; None.
;
; RESTRICTIONS:
; N, the number of matched points in the transformed and reference
; images should be large (greater than 20), should be taken from
; widely spaced locations in the image field-of-view, and should
; be measured to within 1-pixel for greatest accuracy.
;
; Off-center rotation and translation require a two-stage approach
; for image registration. i.e. in the first stage, apply the parameters
; given by this routine to the test image. A second set of points
; is then selected from the image and the reference image, and
; a second run of this program should output a final translation
; to be applied to the test image to bring it in registration with
; the reference image. This is tested for and the user is alerted.
;
; PROCEDURE:
; Using least squares estimation, determine the elements
; of the general affine transformation (rotation and/or scaling
; and/or translation and/or shearing) of an image onto a reference
; image.
;
; See: Image Processing for Scientific Applications
; Bernd J\"ahne
; CRC Press, 1997, Chapter 8.
;
; Use AFFINE.PRO (or ROT.PRO if no shear is found) to apply the
; transformation to the test image after computing them with this routine.
;
; MODIFICATION HISTORY:
; Written: T. Berger, LMATC, 24-Feb-1998.
; Added no rotation/translation test. TEB, 2-March-98.
; 10-March-1998 - S.L.Freeland - Backward compatible for IDL V<5
;-
ON_ERROR,2
x = xin
xp = xpin
n1 = (SIZE(x))(1)
n2 = (SIZE(xp))(1)
if n2 ne n1 then begin
MESSAGE,'Number of points must be the same in both input arrays'
RETURN
end
y = DOUBLE(x(*,1))
x = DOUBLE(x(*,0))
yp = DOUBLE(xp(*,1))
xp = DOUBLE(xp(*,0))
;Least squares solution for matrix elements: see Notebook 5, p. 132.
AT = DBLARR(2*n1,6)
zerow = [REPLICATE(0,n1)]
onerow = [REPLICATE(1,n1)]
AT(INDGEN(n1)*2,*) = [[x],[y],onerow,zerow,zerow,zerow]
AT(INDGEN(n1)*2+1,*) = [zerow,zerow,zerow,[x],[y],onerow]
A = TRANSPOSE(AT)
b = TRANSPOSE(DBLARR(2*n1))
b(INDGEN(n1)*2) = xp
b(INDGEN(n1)*2+1) = yp
xb = INVERT(AT##A,/DOUBLE)##AT##REFORM(b)
;Solve for transformation elements:
theta = -ATAN(xb(3),xb(4))
mx = xb(3)*(xb(1)*xb(3)-xb(0)*xb(4))/SIN(theta)/(xb(3)^2+xb(4)^2)
my = -xb(3)/SIN(theta)
sx = (xb(0)*xb(3)+xb(1)*xb(4))/(xb(0)*xb(4)-xb(1)*xb(3))
;Translation solution:
det = xb(0)*xb(4)-xb(1)*xb(3)
denom = (xb(0)+xb(4)) - det - 1.
xc = -(xb(2) - xb(2)*xb(4)+xb(1)*xb(5))/denom
yc = -(xb(2)*xb(3)+xb(5)-xb(0)*xb(5))/denom
trans=0
if theta lt 5e-03 then begin ;no rotation - use simple translation solve:
trans=1
xc = xb(2)
yc = xb(5)
end
;Return the transformation FROM x TO xp:
; ie. rotate image by theta degrees counterclockwise to get to reference image
theta = theta/!dtor
if theta gt 0 then dir='clockwise' else dir='counterclockwise'
if KEYWORD_SET(blab) then begin
stheta = STRCOMPRESS(ABS(theta),/re)
sxc = STRCOMPRESS(xc,/re)
syc = STRCOMPRESS(yc,/re)
smx = STRCOMPRESS(mx,/re)
smy = STRCOMPRESS(my,/re)
ssx = STRCOMPRESS(sx,/re)
PRINT,''
PRINT,'Relative to the reference image, the test image is:'
if not trans then begin
PRINT,' Rotated ',stheta,' degrees ',dir
PRINT,' with the center of rotation at'
PRINT,' xc = ',sxc
PRINT,' yc = ',syc
end else begin
PRINT,' Rotated ',stheta,' degrees ',dir
PRINT,' Translated by'
PRINT,' dx = ',sxc
PRINT,' dy = ',syc
end
PRINT,' Scaled by a factor of ',smx,' horizontally'
PRINT,' Scaled by a factor of ',smy,' vertically'
PRINT,' Sheared horizontally by a factor of = ',ssx
PRINT,''
end
RETURN
END