When you have optional arguments like that, you have to omit them if you don't want to use them. Otherwise the function thinks you are trying to specify them, but because you haven't defined cx, cy, linlog, shape it gives an error. i.e. you need to change the call to polartrans to:
pim = polartrans(im, nrad, ntheta);
"Darren g" wrote in message <email@example.com>... > Hi Phillip, > > Thanks for the detailed information. I am not an expert in matlab but currently learning for this image rotation measurement. I have tried the polartrans.m function. But, when calling this function what values I need to supply within the code. I tried nrad=256 and ntheta=360, are the width of my image and a full range of theta. My understanding is that the other parameters cx, cy, linlog, shape should take some default values but when running the code it show error "??? Undefined function or variable 'cx'". Here is the code I tried for polar transform. > > a=1; > image = strcat('',num2str(a,'%04d'),'.png'); > im = imread(image); > figure(1); > imagesc(im); > axis image; > nrad = 256; ntheta = 360; > pim = polartrans(im, nrad, ntheta, cx, cy, linlog, shape); > figure(2); > imagesc(pim);title('Polar transform of image'); > axis image; > > Any error in this code? > > Thanks in advance. > Darren > > > "Phillip" wrote in message <firstname.lastname@example.org>... > > Hi Darren, > > > > From the link I gave above, I used the "polartrans.m" file. > > > > Once you have the two polar images, do a plain X/Y (translation) cross-correlation. If the images are just rotated and not stretched, the peak of the cross-correlation function will be displaced by some amount (I forget in which direction, but should be obvious when you display the images). Each division in the image is worth 2*pi/ntheta angular units (where ntheta is an argument that you give to the polartrans function). > > > > If you haven't done a cross-correlation before, have a look at xcorr2 (I think this requires the signal processing toolbox). Play around with images that just require a translation - once you have that figured out, do the same thing but using your polar images, and multiply by the amount given above to determine the angle. > > > > NB: In R2012 onwards the Image Processing toolbox has an "imregister" function that can apparently do all sorts of registrations, including rotations. I find it works well for some kinds of images but not others; you might want to give it a shot. > > > > "Darren g" wrote in message <email@example.com>... > > > Hi Phillip, > > > I am also trying to measure the image rotation for very small angle (fractional as well) noisy images. Could you please let me know the function you used from the link you provided. Also, how did you calculate the angle of rotation from the polar transform. I have used polar transform function from the one got from the internet but do not know how to proceed for the angular measurement after polar transforming the two images. > > > Any help would be much appreciated. > > > Thanks. > > > Darren > > > > > > "Phillip" wrote in message <firstname.lastname@example.org>... > > > > > while trying this code i got this error....can you tell me WHY ????? > > > > > > > > > > ??? Error using ==> times > > > > > Matrix dimensions must agree. > > > > > > > > > > > for ii = 1:length(thetas) > > > > > > b = P2(:,ii); > > > > > > this_correlation = abs(ifft(P1.*conj(b))); > > > > > > angle_scores(ii) = max(max(this_correlation)); > > > > > > end > > > > > > > > Make sure that P1 is a column vector and P2 has the same number of rows as P1. > > > > > > > > However, I've changed the way I solve this problem now. Two points to note for anybody stumbling on this: > > > > > > > > 1) What I said about only needing one radon projection for the reference might be true in theory, but I found in practice with noisy data that this was not so good. I've actually abandoned the radon approach. > > > > > > > > 2) I now solve my rotation problem in an entirely different way. I'm not sure how generally applicable this solution is, but it worked well for my application (very large images, only small angles of rotation possible, very precise estimate of rotation necessary). > > > > > > > > I find the polar transforms of the reference and acquired images, and then do a typical registration between these using cross-correlation. The shift required in the theta dimension tells you the rotation required (the other dimension has radius info which I don't use). > > > > I got a Matlab function for creating a polar transform from this page: > > > > > > > > http://www.csse.uwa.edu.au/~pk/Research/MatlabFns/ > > > > > > > > This function lets you specify the sampling in both the theta and radial dimensions. I upsample quite a bit in the theta dimension (better precision on the angle estimate) and downsample in the radial dimension (to keep memory costs down - my images are quite large). > > > > > > > > Hope this approach is useful to others.