summaryrefslogtreecommitdiffstats
path: root/SD-VBS/common/toolbox/toolbox_basic/textons/find_textons.m
blob: e7fa4b0ff9a4af1fe99c706fc37fe301cbdfb4fb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function [centers,label,post,d2]=find_textons(FIw,ncenters,centers_in,n_iter);
% [centers,label,post,d2]=find_textons(FIw,ncenters,centers_in,n_iter);
% 
% find textons using kmeans for windowed portion FIw of filtered image 
%
% to start with centers pulled randomly from image, set centers_in=[]

% define number of textons
%ncenters=25;

[N1,N2,N3]=size(FIw);
% reshape filtered image stack into a long array of feature vectors
fv=reshape(FIw,N1*N2,N3);
% (each row is a feature vector)

%centers=.01^2*randn(ncenters,N3);
% take centers randomly from within image
if isempty(centers_in)
   rndnum=1+floor(N1*N2*rand(1,ncenters));
   centers_in=fv(rndnum,:);
end

options = foptions;
options(1)=1;		% Prints out error values.
options(5) = 0;
if nargin<4
   n_iter=15;
end
options(14) = n_iter;		% Number of iterations.

[centers,options,d2,post]=kmeans2(centers_in,fv,options);

% reshuffle the centers so that the one closest to the origin
% (featureless) comes last
norms=sum(centers.^2,2);
[sortval,sortind]=sort(-norms);
centers=centers(sortind,:);
d2=reshape(d2,N1,N2,ncenters);
post=reshape(post,N1,N2,ncenters);
d2=d2(:,:,sortind);
post=post(:,:,sortind);


% retrieve cluster number assigned to each feature vector
[minval,label]=min(d2,[],3);