下面三个函数完成极对数坐标转换
- function [rout,g,b] = imlogpolar(varargin)
- %IMLOGPOLAR Compute logarithmic polar transformation of image.
- % B = IMLOGPOLAR(A,NRHO,NTHETA,METHOD) computes the logarithmic
- % polar transformation of image A, generating a log polar image
- % of size NRHO by NTHETA. METHOD describes the interpolation
- % method. METHOD is a string that can have one of these values:
- %
- % 'nearest' (default) nearest neighbor interpolation
- %
- % 'bilinear' bilinear interpolation
- %
- % 'bicubic' bicubic interpolation
- %
- % If you omit the METHOD argument, IMLOGPOLAR uses the default
- % method of 'nearest'.
- %
- % B = IMLOGPOLAR(A,NRHO,NTHETA,METHOD,CTR) assumes that the 2x1
- % vector CTR contains the coordinates of the origin in image A.
- % If CTR is not supplied, the default is CTR = [(m+1)/2,(n+1)/2],
- % where A has n rows and m columns.
- %
- % B = IMLOGPOLAR(A,NRHO,NTHETA,METHOD,CTR,SHAPE) where SHAPE is a
- % string that can have one of these values:
- %
- % 'full' - returns log polar transformation containing ALL
- % pixels from image A (the circumscribed circle
- % centered at CTR)
- %
- % 'valid' - returns log polar transformation containing only
- % pixels from the largest inscribed circle in image A
- % centered at CTR.
- %
- % If you omit the SHAPE argument, IMLOGPOLAR uses the default shape
- % of 'valid'. If you specify the shape 'full', invalid values on the
- % periphery of B are set to NaN.
- %
- % Class Support
- % -------------
- % The input image can be of class uint8 or double. The output
- % image is of the same class as the input image.
- %
- % Example
- % -------
- % I = imread('ic.tif');
- % J = imlogpolar(I,64,64,'bilinear');
- % imshow(I), figure, imshow(J)
- %
- % See also IMCROP, IMRESIZE, IMROTATE.
- % Nathan D. Cahill 8-16-01, modified from:
- % Clay M. Thompson 8-4-92
- % Copyright 1993-1998 The MathWorks, Inc. All Rights Reserved.
- % $Revision: 5.10 $ $Date: 1997/11/24 15:35:33 $
- % Grandfathered:
- % Without output arguments, IMLOGPOLAR(...) displays the transformed
- % image in the current axis.
- [Image,rows,cols,Nrho,Ntheta,Method,Center,Shape,ClassIn] = parse_inputs(varargin{:});
- threeD = (ndims(Image)==3); % Determine if input includes a 3-D array
- if threeD,
- [r,g,b] = transformImage(Image,rows,cols,Nrho,Ntheta,Method,Center,Shape);
- if nargout==0,
- imshow(r,g,b);
- return;
- elseif nargout==1,
- if strcmp(ClassIn,'uint8');
- rout = repmat(uint8(0),[size(r),3]);
- rout(:,:,1) = uint8(round(r*255));
- rout(:,:,2) = uint8(round(g*255));
- rout(:,:,3) = uint8(round(b*255));
- else
- rout = zeros([size(r),3]);
- rout(:,:,1) = r;
- rout(:,:,2) = g;
- rout(:,:,3) = b;
- end
- else % nargout==3
- if strcmp(ClassIn,'uint8')
- rout = uint8(round(r*255));
- g = uint8(round(g*255));
- b = uint8(round(b*255));
- else
- rout = r; % g,b are already defined correctly above
- end
- end
- else
- r = transformImage(Image,rows,cols,Nrho,Ntheta,Method,Center,Shape);
- if nargout==0,
- imshow(r);
- return;
- end
- if strcmp(ClassIn,'uint8')
- if islogical(Image)
- r = im2uint8(logical(round(r)));
- else
- r = im2uint8(r);
- end
- end
- rout = r;
- end
复制代码- function [A,Ar,Ac,Nrho,Ntheta,Method,Center,Shape,Class] = parse_inputs(varargin)
- % Outputs: A the input image
- % Nrho the desired number of rows of transformed image
- % Ntheta the desired number of columns of transformed image
- % Method interpolation method (nearest,bilinear,bicubic)
- % Center origin of input image
- % Shape output size (full,valid)
- % Class storage class of A
- error(nargchk(3,6,nargin));
- A = varargin{1};
- Ar = size(A,1); % Ar = number of rows of the input image
- Ac = size(A,2); % Ac = number of columns of the input image
- Nrho = varargin{2};
- Ntheta = varargin{3};
- Class = class(A);
- if nargin < 4
- Method = '';
- else
- Method = varargin{4};
- end
- if isempty(Method)
- Method = 'nearest';
- end
- Method = lower(Method);
- if ~any(strcmp(Method,{'nearest','bilinear','bicubic'}))
- error('Method must be one of ''nearest'', ''bilinear'', or ''bicubic''.');
- end
- if nargin < 5
- Center = [];
- else
- Center = varargin{5};
- end
- if isempty(Center)
- Center = [(Ac+1)/2 (Ar+1)/2];
- end
- if length(Center(:))~=2
- error('Center should be 1x2 array.');
- end
- if
- any(Center(:)>[Ac;Ar] | Center(:)<1) % THIS LINE USED TO READ 'if
- any(Center(:)>[Ar;Ac] | Center(:)<1)' but Ar and Ac should be
- swapped round -- look at line 40 for whty this should be. A.I.Wilmer,
- 12th Oct 2002
- num2str(['Center is
- ',num2str(Center(1)),',',num2str(Center(2)) ' with size of image =
- ',num2str(Ar),'x',num2str(Ac),' (rows,columns)'])
- warning('Center supplied is not within image boundaries.');
- end
- if nargin < 6
- Shape = '';
- else
- Shape = varargin{6};
- end
- if isempty(Shape)
- Shape = 'valid';
- end
- Shape = lower(Shape);
- if ~any(strcmp(Shape,{'full','valid'}))
- error('Shape must be one of ''full'' or ''valid''.');
- end
- if isa(A, 'uint8'), % Convert A to Double grayscale for interpolation
- if islogical(A)
- A = double(A);
- else
- A = double(A)/255;
- end
- end
复制代码- function [r,g,b] = transformImage(A,Ar,Ac,Nrho,Ntheta,Method,Center,Shape)
- % Inputs: A the input image
- % Nrho the desired number of rows of transformed image
- % Ntheta the desired number of columns of transformed image
- % Method interpolation method (nearest,bilinear,bicubic)
- % Center origin of input image
- % Shape output size (full,valid)
- % Class storage class of A
- global rho;
- theta = linspace(0,2*pi,Ntheta+1); theta(end) = [];
- switch Shape
- case 'full'
- corners = [1 1;Ar 1;Ar Ac;1 Ac];
- d = max(sqrt(sum((repmat(Center(:)',4,1)-corners).^2,2)));
- case 'valid'
- d = min([Ac-Center(1) Center(1)-1 Ar-Center(2) Center(2)-1]);
- end
- minScale = 1;
- rho = logspace(log10(minScale),log10(d),Nrho)'; % default 'base 10' logspace - play with d to change the scale of the log axis
- % convert polar coordinates to cartesian coordinates and center
- xx = rho*cos(theta+pi) + Center(1);
- yy = rho*sin(theta+pi) + Center(2);
- if nargout==3
- if strcmp(Method,'nearest'), % Nearest neighbor interpolation
- r=interp2(A(:,:,1),xx,yy,'nearest');
- g=interp2(A(:,:,2),xx,yy,'nearest');
- b=interp2(A(:,:,3),xx,yy,'nearest');
- elseif strcmp(Method,'bilinear'), % Linear interpolation
- r=interp2(A(:,:,1),xx,yy,'linear');
- g=interp2(A(:,:,2),xx,yy,'linear');
- b=interp2(A(:,:,3),xx,yy,'linear');
- elseif strcmp(Method,'bicubic'), % Cubic interpolation
- r=interp2(A(:,:,1),xx,yy,'cubic');
- g=interp2(A(:,:,2),xx,yy,'cubic');
- b=interp2(A(:,:,3),xx,yy,'cubic');
- else
- error(['Unknown interpolation method: ',method]);
- end
- % any pixels outside , pad with black
- mask= (xx>Ac) | (xx<1) | (yy>Ar) | (yy<1);
- r(mask)=NaN;
- g(mask)=NaN;
- b(mask)=NaN;
- else
- if strcmp(Method,'nearest'), % Nearest neighbor interpolation
- r=interp2(A,xx,yy,'nearest');
- elseif strcmp(Method,'bilinear'), % Linear interpolation
- r=interp2(A,xx,yy,'linear');
- elseif strcmp(Method,'bicubic'), % Cubic interpolation
- r=interp2(A,xx,yy,'cubic');
- else
- error(['Unknown interpolation method: ',method]);
- end
- % any pixels outside warp, pad with black
- mask= (xx>Ac) | (xx<1) | (yy>Ar) | (yy<1);
- r(mask)=NaN;
- end
复制代码 |