]> AND Private Git Repository - these_gilles.git/blob - THESE/codes/meanshift/Ms_segmenter/M_shift3.m
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
final
[these_gilles.git] / THESE / codes / meanshift / Ms_segmenter / M_shift3.m
1 function [Mode, Number_values] = M_shift3 (Values, Window_radius, Initial)\r
2 % assumes that Values contains cumulative information, i.e.\r
3 % the number of elements of the particular value in each Values cell\r
4 \r
5 Current_val = round(Initial+2);Next_val = round(Initial);\r
6 L1 = size(Values, 1);L2 = size(Values, 2);L3 = size(Values, 3);\r
7 Min_number_values = 1; % Window_radius^4\r
8 \r
9 while norm(Next_val-Current_val) > 1\r
10    Current_val = Next_val;\r
11    clear x;\r
12    [x(1, :, :, :), x(2, :, :, :), x(3, :, :, :)] = ...\r
13       ndgrid(...\r
14       [max(1, Current_val(1)-Window_radius): ...\r
15       min(L1, Current_val(1)+Window_radius)], ...\r
16       [max(1, Current_val(2)-Window_radius): ...\r
17       min(L2, Current_val(2)+Window_radius)], ...\r
18       [max(1, Current_val(3)-Window_radius): ...\r
19       min(L3, Current_val(3)+Window_radius)]);\r
20    \r
21    Window = Values(...\r
22       max(1, Current_val(1)-Window_radius): ...\r
23       min(L1, Current_val(1)+Window_radius), ...\r
24       max(1, Current_val(2)-Window_radius): ...\r
25       min(L2, Current_val(2)+Window_radius), ...\r
26       max(1, Current_val(3)-Window_radius): ...\r
27       min(L3, Current_val(3)+Window_radius));\r
28    \r
29    for i=1:3\r
30       Sum_values(1, i) = sum(sum(sum(squeeze(x(i, :, :, :)) .* Window)));\r
31    end\r
32    \r
33    Number_values = sum(sum(sum(Window)));\r
34    \r
35    if Number_values < Min_number_values\r
36       Mode = Initial;\r
37       Number_values = 0;\r
38       return;\r
39    end\r
40    \r
41    Next_val = round(Sum_values/Number_values);\r
42 end\r
43 Mode = Next_val;\r
44 \r