⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagesvd.m

📁 有趣的可视的数值方法 出自网站http://www.mathworks.com/moler
💻 M
字号:
function imagesvd(varargin)% IMAGESVD   Principle component analysis of monochrome and color images.%    IMAGESVD('file1.fmt','file2.fmt', ... ) reads the specified image%    files.  Any format known to IMREAD is acceptable.%    IMAGESVD, with no arguments, provides popup menu access to several%    images from the NCM and demos directories.%    imagesvd('slide') is the callback from the rank slider.%    imagesvd('menu') is the callback from the popup menu.if nargin == 0  | ~isequal(varargin{1},'slide')   if nargin == 0  | ~isequal(varargin{1},'menu')      % Initialize uicontrols      shg      clf      set(gcf,'doublebuffer','on','numbertitle','off','name','Image SVD');      if nargin > 0         L = varargin;      else         L = {'detail.mat','durer.mat','fern.png','clown.mat', ...             'earth.mat','mandrill.mat','gatlin.mat'};      end      startwith = 1;      h.popup = uicontrol('units','norm','pos',[.10 .03 .20 .05], ...         'style','popup','val',startwith,'string',L, ...         'callback','imagesvd(''menu'')');      h.slider = uicontrol('units','norm','pos',[.38 .02 .24 .04], ...         'style','slider','value',0,'callback','imagesvd(''slide'')');      h.limit = uicontrol('units','norm','pos',[.62 .02 .05 .04], ...         'style','text');      h.rank = uicontrol('units','norm','pos',[.42 .06 .16 .04], ...         'style','text','string',' ');      h.close = uicontrol('units','norm','pos',[.80 .03 .10 .05], ...         'string','close','callback','close');      set(gcf,'userdata',h)   end    % Read or load a new image.   % Monochrome is a single 2-D array of intensities.   % Color is a 3-D array of red, green and blue intensities.   h = get(gcf,'userdata');   L = get(h.popup,'string');   name = L{get(h.popup,'val')};   if isempty(findstr(name,'.mat'))      % Read image file      X = imread(name);      X = double(X)/255;   else      % Load .mat file containing indexed image 'X' and colormap 'map'.      % Convert to intensities.      load(name)      if norm(diff(map'),1) == 0         % Monochrome image         T = map(X,1);         X = reshape(T,size(X));      else         % Color image         T = [map(X,1) map(X,2) map(X,3)];         X = reshape(T,[size(X) 3]);      end   end   % Resize large images to reduce computation time.   [m,n,p] = size(X);   while m >= 768      i = 1:2:m-1;      j = 1:2:n-1;      X = (X(i,j,:)+X(i+1,j,:)+X(i,j+1,:)+X(i+1,j+1,:))/4;      [m,n,p] = size(X);   end   % Display the input image.%  imager(X)   % Slider parameters depend upon size the image.   mn = min(m,n);   set(h.slider,'val',1,'min',0,'max',mn,'sliderstep',[1/mn 10/mn])   set(h.limit,'string',int2str(mn))   set(h.rank,'string','')   % Compute the singular value decomposition of the image.   msg = uicontrol('units','norm','pos',[.25 .56 .50 .10], ...      'style','text','fontsize',14, ...      'string',['Computing ' int2str(n*p) '-by-' int2str(m) ' SVD...']);   drawnow   X = reshape(X,m,p*n);   [V,S,U] = svd(X',0);   % Save the SVD in the figure's user data.   h.U = U;   h.S = S;   h.V = V;   h.m = m;   h.n = n;   h.p = p;   set(gcf,'userdata',h)   delete(msg);end% Update the plot.h = get(gcf,'userdata');U = h.U;S = h.S;V = h.V;m = h.m;n = h.n;p = h.p;% Obtain the rank from the slider.r = round(get(h.slider,'value'));set(h.slider,'value',r)set(h.rank,'string',['rank = ' num2str(r)]);% Rank r approximation.k = 1:r;X = U(:,k)*S(k,k)*V(:,k)';X = reshape(X,m,n,p);imager(X)drawnow% ------------------------------------function imager(X)% Display the image.X(X<0) = 0;X(X>1) = 1;if ndims(X) == 3   image(X)else   image(255*X)   colormap(gray(256));endaxis imageaxis off

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -