This example shows one way to perform step 2:
A = 'peppers.jpg';
img = im2double(imread(A));
img_r=imrotate(img,20,'nearest','crop'); % <-- this is the distorted image
% rotated 20 deg
xopt = fminsearch(@(x) imr(x,img_r,img), 10); % <-- start with 10 deg as guess
where imr is the function
function obj= imr(x,img1,img2);
img1_r = imrotate(img1,x,'nearest','crop');
obj = sum((img2(:)-img1_r(:)).^2);
The function wraps imrotate, generating an objective function to minimize so that it can be used by fminsearch.
This shows the original, distorted, and reversed image (with angle determined as above):

Note the limitations: the rotated images are cropped so that a point-by-point comparison is possible during computation of the objective function.
This is probably not the absolutely best way to do this, as I imagine that there are morphological algorithms designed to answer your specific question in a more general way. Still it worked.