• API
• FAQ
• Tools
• Archive
SHARE
TWEET # Untitled a guest Oct 17th, 2016 78 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
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy.
Top