新的对数极变换的代码
%function[rout,g,b]=LHimlogpolar(image,Nrho,Ntheta,Method,Center,Shape)function [rout,g,b] = LHimlogpolar(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.
% 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[Image,rows,cols,Nrho,Ntheta,Method,Center,Shape,ClassIn]=LHparse_inputs(varargin{:});threeD = (ndims(Image)==3); % Determine if input includes a 3-D array
if threeD, [r,g,b] = LHtransformImage(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 endelse r = LHtransformImage(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] = LHparse_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 Aerror(nargchk(3,6,nargin));
A = varargin{1};
Ar = size(A,1); % Ar = number of rows of the input imageAc = 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};endif isempty(Method) Method = 'nearest';endMethod = 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};endif isempty(Center) Center = [(Ac+1)/2 (Ar+1)/2];endif length(Center(:))~=2 error('Center should be 1x2 array.');endif any(Center(:)>[Ac;Ar] | Center(:)<1) % THIS LINE USED TO READ 'ifany(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};endif isempty(Shape) Shape = 'valid';endShape = 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; endend
function [r,g,b] = LHtransformImage(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 Shapecase '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]);endminScale = 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 centerxx = rho*cos(theta+pi) + Center(1);yy = rho*sin(theta+pi) + Center(2);
if nargout==3if strcmp(Method,'nearest'), % Nearest neighbor interpolation [xi,yi] = meshgrid(-3:.1:3,-3:.1:3) 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 blackmask= (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'); %r=interp2(A,xx,yy,'nearest');elseif strcmp(Method,'bilinear'), % Linear interpolation size(A) r=interp2(A,xx,yy,'linear'); %r=interp2(A,xx,yy,'linear');elseif strcmp(Method,'bicubic'), % Cubic interpolation r=interp2(A,xx,yy,'cubic'); %r=interp2(A,xx,yy,'cubic');else error(['Unknown interpolation method: ',method]);end% any pixels outside warp, pad with blackmask= (xx>Ac) | (xx<1) | (yy>Ar) | (yy<1);r(mask)=NaN;end
本文来源:https://www.2haoxitong.net/k/doc/21fb6bc18bd63186bcebbc47.html
文档为doc格式