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

📄 im_patch.m

📁 这是我找到的一个模式识别工具箱
💻 M
字号:
%IM_PATCH Generate patches from images%%   B = IM_PATCH(A,PSIZE,PNUM,TYPE)%   B = IM_PATCH(A,PSIZE,COORD,'user')%   W = IM_PATCH([],PSIZE,PNUM,TYPE)%   B = A*W%% INPUT%   A        Dataset or datafile with (multi-band) object images dataset%   PSIZE    2-dimensional patch size. If PSIZE is 1-dimensional square%            patches of size PSIZE x PSIZE are generated. In case PSIZE < 1, %            it is taken relatuive to the images size. In this case patches %            may become non-square for non-square images. Default 3 x 3%   PNUM     Number of patches, default 1%   COORD    Given set of N x 2 image coordinates of patch centra. This may%            be given either in pixels (ANY(COORD > 1) or relative to the %            image size (ALL(COORD <= 1).%   TYPE     'syst': systematic sampling generating PNUM x PNUM patches%            'rand': generation of a random set op PNUM patches%            'user': user defined patch positions, see COORD%            Default: 'syst'.%% OUTPUT%   W        Mapping performing the desired patch generation%   B        Resulting dataset or datafile with the same number of objects%            as in A. Single images are replaced by the patches.%% DESCRIPTION% The object images (including their N bands) are sampled and windows of size% PSIZE are generated, replacing the original image object. They are stored% as [PSIZE(1) PSIZE(2) NUM*N] image objects, in which N is the original% number of bands and NUM is either PNUM (for TYPE is 'rand' or 'user') or% PNUM x PNUM (for TYPE is 'syst'). %% By BAND2OBJ(B,N) individual patches can be transformed into objects.%% EXAMPLES% B = IM_PATCH(A,0.5) % generate just the central parts of the images % B = IM_PATCH(A,[3 5],2) % generates 4 patches of size 3x5 in centra of%                     % the four quadrants% B = IM_PATCH(A,0.1,10,'rand') % generate at random positions 10 patches%                     %each with a linear size of 0.1 of the image size.%% SEE ALSO% DATASETS, DATAFILES, BAND2OBJ% Copyright: R.P.W. Duin, r.p.w.duin@prtools.org% Faculty EWI, Delft University of Technology% P.O. Box 5031, 2600 GA Delft, The Netherlandsfunction b = im_patch(a,psize,pnum,option,N)	prtrace(mfilename);	  if nargin < 5, N = []; end % N just needed for datafiles that want to have a single patch	if nargin < 4 | isempty(option), option = 'syst'; end	if nargin < 3, pnum = 1; end	if nargin < 2, psize = [3 3]; end  if nargin < 1 | isempty(a)    b = mapping(mfilename,'fixed',{psize,pnum,option});    b = setname(b,'Image patches');	elseif isa(a,'dataset') % allows datafiles too		isobjim(a);		fsize = getfeatsize(a,3);		if strcmp(option,'rand')			pnum = rand(pnum,2);  % generate desired number of points			option = 'user';		end    b = filtim(a,mfilename,{psize,pnum,option});	else                          % here we have a single image		a = double(a);		asize = size(a);		if length(psize) == 1, psize = [psize psize]; end		if all(psize < 1), psize = psize.*asize; end		                          % user want to know how many patches		if ~isempty(N) & N == 0   % this is just a hack, could be smarter			if strcmp(option,'syst')				if length(pnum == 1), npatches = pnum*pnum;				else, npatches = prod(pnum); end			elseif strcmp(option,'user'), npatches = size(pnum,1);			elseif strcmp(option,'random'), npatches = pnum;			else error('Unknown option');			end			b = npatches;			return		end				rsize = round(psize);		if strcmp(option,'syst')			if length(pnum) == 1, pnum = [pnum pnum]; end			if isempty(N)				patches = zeros(rsize(1),rsize(2),pnum(1)*pnum(2));      			else				patches = zeros(rsize(1),rsize(2),length(N));			end			for i=1:2				if pnum(i)*psize(i) <= asize(i)					%s(i) = asize(i)/(2*pnum(i))-psize(i)/2+0.5;					s(i) = asize(i)/(2*pnum(i))-psize(i)/2+1;					d(i) = asize(i)/pnum(i);				else					%s(i) = 0.5;					s(i) = 1;					d(i) = (asize(i)-psize(i))/(pnum(i)-1);				end			end			if isempty(N)				for j2 = 1:pnum(2)					for j1 = 1:pnum(1)						aa = a(round(s(1)+(j1-1)*d(1)):round(s(1)+(j1-1)*d(1))+rsize(1)-1, ...							  round(s(2)+(j2-1)*d(2)):round(s(2)+(j2-1)*d(2))+rsize(2)-1);						patches(:,:,(j2-1)*pnum(1)+j1) = aa;					end				end			else				for n = 1:length(N)					j2 = floor((N(n)-1)/pnum(1))+1;					j1 = N(n) - pnum(1)*(j2-1);					aa = a(round(s(1)+(j1-1)*d(1)):round(s(1)+(j1-1)*d(1))+rsize(1)-1, ...					    round(s(2)+(j2-1)*d(2)):round(s(2)+(j2-1)*d(2))+rsize(2)-1);					patches(:,:,n) = aa;				end			end		elseif strcmp(option,'rand')			locs = rand(pnum,2);			if ~isempty(N)				locs = locs(N,2);			end			patches = feval(mfilename,a,psize,locs,option);		elseif strcmp(option,'user')			locs = pnum;			if ~isempty(N)				locs = locs(N,:);			end			pnum = size(locs,1);			patches = zeros(rsize(1),rsize(2),pnum);			if all(locs(:) <= 1) % positions given as relative coordinates				locs = locs*repmat([asize(1)-psize(1),asize(2)-psize(2)],pnum,1);				locs = locs + repmat([0.5 0.5],pnum,1);			end			border = max(ceil(rsize/2));			a = bord(a,NaN,border); % create mirror border to avoid problems (takes time!!)			locs = locs + border;			for j = 1:pnum				s = round(locs(j,:)-psize/2);				patches(:,:,j) = a(s(1):s(1)+rsize(1)-1,s(2):s(2)+rsize(2)-1);			end		end		b = patches;		end	return

⌨️ 快捷键说明

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