 # Untitled

a guest
Oct 17th, 2016
91
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. function demoing(write)
2. if ~exist('write', 'var'), write = false; end;
3. SI =5; SX = 6; r = 1.5; sNcut = 0.02;
5. segI = main(I, SI, SX, r, sNcut);
6. % show
7. for i=1:length(segI)
8.     if ~write
9.         figure; imshow(segI{i});
10.     end
11. end
12. end
13.
14. function SegI = main(image, sig_i, sig_x, r, min_cut)
15.
16. [num_row, num_col, components] = size(image);
17. N=num_row * num_col;
18.
19. % create graph (vertical list)
20. V=reshape(image, N, components);
21.
22. % Step 1. Compute weight matrix W, and D
23. W = computeW(image, sig_i, sig_x, r);
24.
25. % nodes are labled by pixel #
26. Seg=(1:N)';% the first segment has whole nodes. [1 2 3 ... N]'
27. [Seg]=Ncuts(Seg, W, min_cut);
28.
29. % Convert node ids into images
30. for i=1:length(Seg)
31.     subV = zeros(N, components); %ones(N, c) * 255;
32.     subV(Seg{i}, :) = V(Seg{i}, :);
33.     SegI{i} = uint8(reshape(subV, num_row, num_col, components));
34. end
35. end
36.
37. function W = computeW(in_seg, sig_i, sig_x, r);
38. % input will be the image, sig_i (in the exponential weighting), sig_x
39. % (in the exponential weighting), and r the threshold distance
40. % get the parameters of the image the number of rows, columns, and the
41. [num_row, num_col, components] = size(in_seg);
42. N = num_row * num_col;
43. W = zeros(N,N);
44.
45. % Feature Vectors
46. F = in_seg;
47. F = reshape(F, N, 1, components); % col vector
48.
49. %create a matrix of pixel w/ coordinate values
50. xcoord=repmat((1:num_row)', 1, num_col);
51. ycoord=repmat((1:num_col), num_row, 1);
52. X=cat(3, xcoord, ycoord);
53. X=reshape(X, N, 1, 2); % col vector
54.
55. %create symmetrical matrix W with weights
56. % we have two sets of coordinates here one i for the node we are
57. % using as the center node, j nodes which are the ones which it is
58. % connected to
59. for i_col=1:num_col
60.     for i_row=1:num_row
61. %         % compute the j nodes' coordinates using the r value
62. %         % j will be within i_row+r and i_row-r same applies for columns
63. % use floor here because discrete
64.         j_col = (i_col - floor(r)) : (i_col + floor(r)); % vector
65.         j_row = ((i_row - floor(r)) :(i_row + floor(r)))';
66.         j_col = j_col(j_col >= 1 & j_col <= num_col);
67.         j_row = j_row(j_row >= 1 & j_row <= num_row);
68.
69.         % compute the locations of the i nodes
70.         % index in 1D array format
71.         % compute the locations of the j nodes connected to i
72.         % index in 1D array format ??
73.         i = i_row + (i_col - 1) * num_row;
74.         j = repmat(j_row, 1, length(j_col)) + repmat((j_col -1) * num_row, length(j_row), 1);
75.         j = reshape(j, length(j_col) * length(j_row), 1); % a col vector
76.
77.         %compute X_i-X_j and F_i-F_j
78.         X_j = X(j, 1, :);% store coordinates of each index j [x,y] of each connected node
79.         X_i = repmat(X(i, 1, :), length(j), 1);
80.         %compute difference
81.         DiffX = X_i - X_j;
82.         %calculate ||F(i)-F(j)||2 where 2 represents L2 the euclidian distance
83.         DiffX = sum(DiffX .* DiffX, 3); %distance formula in 3D
84.
85.         %retain all points that are relevant using the condition that they are <r
86.         retained = find(sqrt(DiffX) <= r);
87.         j = j(retained);
88.         DiffX = DiffX(retained);
89.
90.         % feature vector disimilarity
91.         F_j = F(j, 1, :);
92.         F_i = repmat(F(i, 1, :), length(j), 1);
93.         DiffF = F_i - F_j;
94.         DiffF = sum(DiffF .* DiffF, 3); % squared euclid distance
95.
96.         %calculate similarity W matrix
97.         W(i, j) = exp(-DiffF / (sig_i*sig_i)) .* exp(-DiffX / (sig_x*sig_x));
98.     end
99. end
100. end
101.
102. function [seg_out ] = Ncuts(in_seg, W, min_cut)
103. % seg_out is the segments returned after cutting
104. % ncut is the normalized cut values of each seg_out part
105. % seg_in represents the segment fed in to be cut
106. % W is the weight matrix computed
107. % min_cut is the minimum cut value (min Ncut(A,B))
108. % min_area is the minimum input area (in paper they used a 5x5 grid)
109.
110. % compute NxN D matrix from section 2.1
111. % recall d(i)=summation_{j} w(i,j) and D is NxN with d on its diag
112. N=length(W);
113. d=sum(W, 2);
114. D=spdiags(d,0,N,N);
115.
116. % as per section section 3 we use the eig_vec with the second smallest
117. % eig_val given by the definition of the rayleigh quotient
118. [eig_vec,diag_eigval] = eigs(D-W, D, 2, 'sm');
119. eig_vec2=eig_vec(:, 2);% grab second smallest
120.
121. % https://www.quora.com/What-is-an-eigenvector-of-a-covariance-matrix
122. % "...and the second eigenvector is orthogonal (perpendicular) to the
123. % first. (for euclidian space)" which i'm guessing means is the center
124. % of the data. knowing that fminsearch will find data based on its initial
125. % value input we can choose the center value to predict a minimum as
126. % follows
127.
128. % HOW TO GET THE MINIMUM EQUATION THING?????
129. t=mean(eig_vec2);
130. t=fminsearch('NcutValue', t, [], eig_vec2, W, D);
131.
132. % get cuts in A and B with the condition that one is less than one is
133. % greatre than
134. A=find(eig_vec2>t);
135. B=find(eig_vec2<=t);
136.
137. % ncut computed value is larger than the condition we set break recursion and end the
138. % function
139. ncut=NcutValue(t, eig_vec2, W, D);
140. if (ncut>min_cut)
141.     seg_out{1}=in_seg;
142.     return;
143. end
144.
145. % recursive call on the A part
146. [seg1] = Ncuts(in_seg(A), W(A, A), min_cut);
147. % recursive call on the B part
148. [seg2] = Ncuts(in_seg(B), W(B, B), min_cut);
149.
150. % return complete array of segments
151. seg_out=[seg1 seg2];
152. end
RAW Paste Data