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;
  4. I = imread('3.jpg');
  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. OK, I Understand
Top