Commit da849ea2cf240713b77e81b2b16fdfd30389bbf7

Authored by Laila Saadatifard
1 parent 76a0f6f9

fix the bug about the gradient anf make syntethic image for test

Showing 3 changed files with 521 additions and 302 deletions   Show diff stats
matlab/main.asv
1   -tic;
2 1 clc;
3 2 clear;
4 3 disp('***************** NEW RUN *********************');
... ... @@ -6,193 +5,291 @@ total = tic;
6 5  
7 6  
8 7 % ******* Initialize voting parameters **************************************
9   -rmax = 9; %maximum radius of the cell
10   -phi_deg = 25.1; %half the angular range of the voting area
11   -phi = phi_deg * pi / 180;
12   -iter = 5; %number of voting iterations
  8 +rmax = 7; %maximum radius of the cell
  9 +ang_deg = 15.1; %half the angular range of the voting area
  10 +ang = ang_deg * pi / 180;
  11 +iter = 2; %number of voting iterations
13 12 t0 = 1.2; %threshold color
14 13 sigma = [4, 4, 2];
15   -final_t = 75;
16   -
  14 +% t = 0.1;
  15 +d_ang= ang / (iter);
17 16  
18 17 % ******** Testing parameters ******************************************
19   -p = [50, 20, 50] ;
20   -ps = [100, 100, 50] - 1;
21   -
22   -volfile = 'img\nissl-rat.vol';
23   -fid = fopen(volfile); % open the file that include the image
24   -S = fread(fid, 3, 'int32');
25   -X = S(1);
26   -Y = S(2);
27   -Z = S(3);
28   -
29   -% load the VOL data into a 2D matrix
30   -I = fread(fid,[X Y*Z], 'uint8');
31   -fclose(fid);
32   -
33   -%change this to a 3D matrix
34   -I = reshape(I, [X, Y, Z]);
35   -
36   -%invert the intensity
37   -I = 255 - I;
  18 +% p = [100, 50, 100];
  19 +% ps = [200, 200, 100];
  20 +ps = [100, 100, 25];
  21 +r = 7;
  22 +I = syn_Img(r , ps);
  23 +% volfile = 'img\nissl-rat.vol';
  24 +% fid = fopen(volfile); % open the file that include the image
  25 +% S = fread(fid, 3, 'int32');
  26 +% X = S(1);
  27 +% Y = S(2);
  28 +% Z = S(3);
  29 +%
  30 +% % load the VOL data into a 2D matrix
  31 +% I = fread(fid,[X Y*Z], 'uint8');
  32 +% fclose(fid);
  33 +%
  34 +% %change this to a 3D matrix
  35 +% I = (reshape(I, [X, Y, Z]));
  36 +%
  37 +% % invert the intensity
  38 +% I = 255 - I;
38 39  
39 40 %perform a gaussian blur
40   -I_blur = gauss_blur3d(I, sigma);
  41 +Iblur = gauss_blur3d(I, sigma);
41 42  
42   -% compute the gradient
43   -[Igrad_x, Igrad_y, Igrad_z] = gradient(I_blur);
  43 +%%crop out a small subregion of I and Iblur
  44 +% Iblur = Iblur(p(1):p(1)+ps(1)-1, p(2):p(2)+ps(2)-1, p(3):p(3)+ps(3)-1);
  45 +% I = I(p(1):p(1)+ps(1)-1, p(2):p(2)+ps(2)-1, p(3):p(3)+ps(3)-1);
44 46  
45   -%%crop out a small subregion of I
46   -Isub_x = Igrad_x(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3));
47   -Isub_y = Igrad_y(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3));
48   -Isub_z = Igrad_z(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3));
  47 +%
  48 +% compute the gradient
  49 +[Igrad_x, Igrad_y, Igrad_z] = gradient(Iblur);
49 50  
50 51 %calculate the gradient magnitude
51   -Imag = sqrt(Isub_x .^ 2 + Isub_y .^ 2 + Isub_z .^2);
  52 +Imag = sqrt(Igrad_x .^ 2 + Igrad_y .^ 2 + Igrad_z .^2);
  53 +I_theta1 = acos(Igrad_x./Imag);
  54 +I_theta2 = acos(Igrad_y./Imag);
  55 +I_theta3 = acos(Igrad_z./Imag);
52 56  
53 57 %set a threshold for the gradient magnitude
54 58 It = Imag > t0;
55 59  
  60 +%Set the boundaries of the threshold image to zero
  61 +It(1:rmax, :, :) = 0;
  62 +It(ps(1) - rmax:ps(1), :,:) = 0;
  63 +It(:, 1:rmax, :) = 0;
  64 +It(:, ps(2) - rmax:ps(2),:) = 0;
  65 +It(:, :, 1:rmax) = 0;
  66 +It(:,:, ps(3) - rmax:ps(3)) = 0;
  67 +
  68 +%get the indices of all of the nonzero values in the threshold image
  69 +% (voter positions)
  70 +[Itx,Ity,Itz] = ind2sub(size(It),find(It));
  71 +Vi = find(It);
  72 +nV = nnz(It);
  73 +
  74 +% create a meshgrid describing coordinates relative to the voter position
  75 +range = -rmax:rmax; %create an array of values between -rmax and rmax
  76 +[mx, my, mz] = meshgrid(range, range, range); %create a template describing local pixel position in a small cube
  77 +m_mag = sqrt(mx.^2 + my.^2 + mz.^2); %create a template describing the distance from the center of a small cube
56 78  
  79 +% create a mask for the voting area
  80 +M_dist = m_mag <= rmax; %mask for the voting area distance (all values < rmax from the center)
  81 +
  82 +%calculate the direction vector between a pixel and voter
  83 +LV_x = mx./m_mag;
  84 +LV_y = my./m_mag;
  85 +LV_z = mz./m_mag;
  86 +
  87 +%number of pixels in the voting area of each voter (initialize to zero)
  88 +validPixels = (zeros(nV,1));
  89 +
  90 +%indices of pixels in the voting area of each voter
  91 +% indices reference the 3D image
  92 +g_v_prime = (zeros(nV, (rmax^3)));
  93 +
  94 +%--------------Display current data-------------------------
57 95 subplot(3, 3, 1),
58   -imshow( squeeze( I(:, :, ceil(size(I, 3)/2)) ) ./ 255 );
59   -%colormap(gray);
  96 +imagesc(squeeze(I(:, :, ceil(size(I, 3)/2))));
60 97  
61 98 subplot(3, 3, 2),
62   -imshow( squeeze( I(:, ceil(size(I, 2)/2), :) ) ./ 255 );
  99 +imagesc(squeeze(I(:, ceil(size(I, 2)/2), :)));
63 100  
64 101 subplot(3, 3, 3),
65   -imshow( squeeze( I(ceil(size(I, 1)/2), :, :) ) ./ 255 );
66   -
  102 +imagesc(squeeze(I( ceil(size(I, 1)/2), :, :)));
  103 +%
67 104 subplot(3, 3, 4),
68   -imagesc( squeeze( Imag(:, :, ceil(size(Imag, 3)/2)) ) );
  105 +imagesc(squeeze(Iblur(:, :, ceil(size(Iblur, 3)/2))));
69 106  
70 107 subplot(3, 3, 5),
71   -imagesc( squeeze( Imag(:, ceil(size(Imag, 2)/2), :) ) );
  108 +imagesc(squeeze(Iblur(:, ceil(size(Iblur, 2)/2), :)));
72 109  
73 110 subplot(3, 3, 6),
74   -imagesc( squeeze( Imag(ceil(size(Imag, 1)/2), :, :) ) );
  111 +imagesc(squeeze(Iblur(ceil(size(Iblur, 1)/2), :, :)));
75 112  
76 113 subplot(3, 3, 7),
77   -imagesc( squeeze( It(:, :, ceil(size(It, 3)/2)) ) );
  114 +imagesc(squeeze(Imag(:, :, ceil(size(Imag, 3)/2))));
78 115  
79 116 subplot(3, 3, 8),
80   -imagesc( squeeze( It(:, ceil(size(It, 2)/2), :) ) );
  117 +imagesc(squeeze(Imag(:, ceil(size(Imag, 2)/2), :)));
81 118  
82 119 subplot(3, 3, 9),
83   -imagesc( squeeze( It(ceil(size(It, 1)/2), :, :) ) );
  120 +imagesc(squeeze(Imag(ceil(size(Imag, 1)/2), :, :)));
84 121  
85   -%
86   -% thresholding
87   -It_x = size(It,1);
88   -It_y = size(It,2);
89   -It_z = size(It,3);
90   -%
91   -It(1:rmax, :, :) = 0;
92   -It(It_x - rmax:It_x, :,:) = 0;
93   -S(:, 1:rmax, :) = 0;
94   -S(:, It_y - rmax:It_y,:) = 0;
95   -S(:, :, 1:rmax) = 0;
96   -S(:,:, It_z - rmax:It_z) = 0;
  122 +colormap(gray);
97 123  
98   -%
99   -[Itx,Ity,Itz] = ind2sub(size(It),find(It));
  124 +%% vote
  125 +tic;
  126 +%for each iteration (in iterative voting)
  127 +for itr = 1 : iter
100 128  
101   -nV = nnz(It);
  129 + %initialize the vote image to zero
  130 + Ivote = (zeros(size(I)));
  131 +
  132 + %for each voter (nonzero pixels in the threshold image It)
  133 + for v = 1: nV
  134 +
  135 + %get the cartesian coordinates of the voter v in the main image I
  136 + vx = Itx(v);
  137 + vy = Ity(v);
  138 + vz = Itz(v);
  139 + vi = Vi(v);
  140 +
  141 + %retreive the gradient magnitude at the voter position
  142 + %vmag = Imag(vx,vy,vz);
  143 + vmag = Imag(vi);
  144 +
  145 + %retrieve the gradient
  146 + gx = Igrad_x(vi);
  147 + gy = Igrad_y(vi);
  148 + gz = Igrad_z(vi);
  149 +
  150 + %calculate the gradient magnitude
  151 + dir_mag = sqrt (gx^2 + gy^2 + gz^2);
  152 +
  153 + %calculate the normalized gradient direction
  154 + ngx = gx / dir
  155 +
  156 + %gdir_x = Igrad_x(vx, vy, vz) / dir_mag;
  157 + %gdir_y = Igrad_y(vx, vy, vz) / dir_mag;
  158 + %gdir_z = Igrad_z(vx, vy, vz) / dir_mag;
  159 +
  160 + %calculate the angle between the voter direction and the pixel direction
  161 + cos_diff = LV_x .* gdir_x + LV_y .* gdir_y + LV_z .* gdir_z;
  162 + ang_diff = acos(cos_diff);
  163 +
  164 + %create an angular mask for the voting area
  165 + M_angle = cos_diff > cos(ang);
  166 +
  167 + %combine the two masks to mask out the voting angle
  168 + M = M_angle .* M_dist;
  169 +
  170 + % get the coordinates of each pixel in the final voter mask M
  171 + pi = find(M);
  172 +
  173 + %calculate the number of pixels in the voting region
  174 + npts = nnz(M);
  175 + validPixels(v) = npts;
  176 +
  177 + %convert every index in the voting area from a local 3D index to a global 3D index (into the original image I)
  178 + global_px = vx + mx(pi);
  179 + global_py = vy + my(pi);
  180 + global_pz = vz + mz(pi);
  181 +
  182 + %convert the global 3D index of each point into a global 1D index
  183 + %global_pi = sub2ind(ps, global_px, global_py, global_pz);
  184 + %global_pi = (global_pz-1)*ps(1)*ps(2) + (global_py-1)*ps(1) + global_px;
  185 + global_pi = sub2ind(ps, global_px, global_py, global_pz);
  186 +
  187 + g_v_prime (v, 1:npts) = global_pi;
  188 +
  189 +
  190 + Ivote( global_pi ) = Ivote( global_pi ) + vmag;
  191 +
  192 + end
  193 +
  194 + if itr ==1
  195 + Ivote1 = Ivote;
  196 +
  197 + elseif itr ==2
  198 + Ivote2 = Ivote;
  199 +
  200 + elseif itr ==3
  201 + Ivote3 = Ivote;
  202 +
  203 + elseif itr ==4
  204 + Ivote4 = Ivote;
  205 +
  206 + elseif itr == 5
  207 + Ivote5 = Ivote;
  208 + end
  209 + t_v1 = toc;
  210 + disp(['voting done. time =',num2str(t_v1)]);
  211 +
  212 + figure, imagesc(squeeze(Ivote(:, :, ceil(size(Ivote, 3)/2),:))); colormap(gray);
  213 +
  214 + % update the voting direction
  215 + tic;
  216 + for v = 1: nV
  217 + % coordinates of the current voter
  218 + vx = Itx(v);
  219 + vy = Ity(v);
  220 + vz = Itz(v);
  221 +
  222 + %get the local value of the voting image
  223 + local_Ivote = Ivote(g_v_prime(v,1:validPixels(v)));
  224 +
  225 + %find the index of the maximum value
  226 + [~, local_max_idx] = max(local_Ivote);
  227 +
  228 + %convert this into a global subscript
  229 + [gx, gy, gz] = ind2sub(size(Ivote), g_v_prime(v,local_max_idx));
  230 +
  231 + %compute the vector from the voter position to this position
  232 + dx = gx - vx;
  233 + dy = gy - vy;
  234 + dz = gz - vz;
  235 + Igrad_x(vx, vy, vz) = dx;
  236 + Igrad_y(vx, vy, vz) = dy;
  237 + Igrad_z(vx, vy, vz) = dz;
  238 +
  239 + end
  240 +
  241 + tdir1 = toc;
  242 + display (['updating dir done. time = ', num2str(tdir1)]);
  243 + ang = ang - d_ang;
  244 + end
  245 +
102 246  
  247 +%%
  248 +t = 10;
  249 +out = Ivote;
  250 +out(out<t) = 0;
  251 +% out(out>=t) = 255;
  252 +out = imregionalmax(out);
103 253  
104   -% create a meshgrid describing coordinates relative to the voter position
105   -range = -rmax:rmax;
106   -[mx, my, mz] = meshgrid(range, range, range);
107   -m_mag = sqrt(mx.^2 + my.^2 + mz.^2);
108   -%create a mask for the voting area
109   -M_dist = mx.^2 + my.^2 + mz.^2 < rmax^2;
  254 +out1(:,:,:,1) = mat2gray(Iblur);
  255 +out1(:,:,:,2) = mat2gray(out);
  256 +out1(:,:,:,3) = mat2gray(Iblur);
110 257  
111   -pxPerRow = size(I_blur,1);
112   -pxPerCol = size(I_blur,2);
113   -validPoints = zeros(nV,1);
114 258  
115   -g_v_prime = zeros(nV, ceil(rmax^2*phi/3));
116 259  
117   -%%
  260 +figure(2);
118 261  
119   -disp('done.');
120   -%% vote
121   -for itr = 1 : iter
122   - Ivote = zeros(size(Iblur));
123   - for v = 1: nV
124   - % coordinates of the current voter
125   - vx = Itx(v);
126   - vy = Ity(v);
127   - vz = Itz(v);
128   -
129   - vgrad = [Isub_x(vx,vy,vz), Isub_y(vx,vy,vz), Isub_z(vx,vy,vz)];
130   - %determine the gradient magnitude at the current voter location
131   - vmag = Imag(vx,vy,vz);
132   - ang_diff = zeros(2*rmax+1, 2*rmax+1, 2*rmax+1);
133   - for i = 1 : 2*rmax+1
134   - for j = 1 : 2*rmax+1
135   - for k = 1 : 2*rmax+1
136   - a = [mx(i,j,k), my(i,j,k), mz(i,j,k)];
137   - c = dot(vgrad, a);
138   - ang_diff(i,j,k) = acos(c/(m_mag(i,j,k)* vmag ));
139   - end
140   - end
141   - end
142   -
143   - M_diff = min(2*pi - ang_diff,ang_diff)<phi;
144   - %compute the final mask
145   - M = (M_dist .* M_diff);
146   -
147   - % get the coordinates of each pixel in the final mask
148   - [vx_prime,vy_prime,vz_prime] = ind2sub(size(M),find(M));
149   -
150   - %transform the local coordinates of the pixels in the voting region
151   - %to the global coordinates of the image
152   -
153   - npts = numel(vx_prime);
154   - validPoints(v) = npts;
155   -
156   - g_v_prime(v,1:npts) = vx + (vx_prime - (rmax + 1)) + (vy + (vy_prime - (rmax + 1))-1).*pxPerRow + (vz + (vz_prime - (rmax + 1))-1).*pxPerRow*pxPerCol;
157   -
158   - for n=1: npts
159   - %
160   - Ivote( g_v_prime(v,n)) = Ivote( g_v_prime(v,n)) + vmag;
161   - end
162   -
163   - end
164   -
165   -disp('voting done.');
166   - %% update the voting direction
167   -
168   - for v = 1: nV
169   - % coordinates of the current voter
170   - vx = sx(v);
171   - vy = sy(v);
172   - vz = sz(v);
173   -
174   - %get the local value of the voting image
175   - local_Ivote = Ivote(g_v_prime(v,1:validPoints(v)));
176   -
177   - %find the index of the maximum value
178   - [~, local_max_idx] = max(local_Ivote);
179   -
180   - %convert this into a global subscript
181   - gz = ceil(g_v_prime(v,local_max_idx)/(pxPerRow*pxPerCol)) ;
182   - gy = ceil((g_v_prime(v,local_max_idx)-(gz - 1)*pxPerRow*pxPerCol)/pxPerRow);
183   - gx = g_v_prime(v,local_max_idx)- pxPerRow*((gy - 1) + (gz - 1) * pxPerCol);
184   -
185   - %compute the vector from the voter position to this position
186   - new_vx = gx - vx;
187   - new_vy = gy - vy;
188   - new_vz = gz - vz;
189   - Igrad_x(vx,vy,vz) = new_vx;
190   - Igrad_y(vx,vy,vz) = new_vy;
191   - Igrad_z(vx,vy,vz) = new_vz;
192   - end
193   -end
194   -cell_center = Ivote;
195   -fido = fopen('out\outImg.vol', 'w+');
196   -fwrite(fido, cell_center);
197   -fclose(fido);
198   -t1 = toc
  262 +subplot(2, 3, 1),
  263 +imagesc(squeeze(Iblur(:, :, ceil(size(Iblur, 3)/2))));
  264 +
  265 +subplot(2, 3, 2),
  266 +imagesc(squeeze(Iblur(:, ceil(size(Iblur, 2)/2), :)));
  267 +
  268 +subplot(2, 3, 3),
  269 +imagesc(squeeze(Iblur( ceil(size(Iblur, 1)/2), :, :)));
  270 +
  271 +subplot(2, 3, 4),
  272 +imagesc( squeeze( out1(:, :, ceil(size(Ivote, 3)/2),:) ) );
  273 +
  274 +subplot(2, 3, 5),
  275 +imagesc(squeeze(out1(:, ceil(size(Ivote, 2)/2), :, :)));
  276 +
  277 +subplot(2, 3, 6),
  278 +imagesc(squeeze(out1( ceil(size(Ivote, 1)/2), :, :, :)));
  279 +
  280 +colormap(gray);
  281 +%%
  282 +% figure, imagesc(squeeze(Iblur(:, :, ceil(size(Iblur, 3)/2)))); colormap(gray);
  283 +% figure, imagesc(squeeze(Ivote(:, :, ceil(size(Ivote, 3)/2),:))); colormap(gray);
  284 +% figure, imagesc(squeeze(Iblur(:, ceil(size(Iblur, 2)/2), :))); colormap(gray);
  285 +% figure, imagesc(squeeze(I(:, ceil(size(Ivote, 2)/2), :))); colormap(gray);
  286 +% % figure, imagesc(squeeze(Iblur( ceil(size(Iblur, 1)/2), :, :))); colormap(gray);
  287 +% figure, imagesc(squeeze(Ivote( ceil(size(Ivote, 1)/2), :, :))); colormap(gray);
  288 +%
  289 +fid1 = fopen('ivote1.vol', 'w');
  290 +fwrite(fid1, Ivote1);
  291 +fclose(fid1);
  292 +
  293 +% fid0 = fopen('iblur.vol', 'w');
  294 +% fwrite(fid0, Iblur);
  295 +% fclose(fid0);
... ...
matlab/main.m
1   -tic;
2 1 clc;
3 2 clear;
4 3 disp('***************** NEW RUN *********************');
... ... @@ -6,193 +5,293 @@ total = tic;
6 5  
7 6  
8 7 % ******* Initialize voting parameters **************************************
9   -rmax = 9; %maximum radius of the cell
10   -phi_deg = 25.1; %half the angular range of the voting area
11   -phi = phi_deg * pi / 180;
12   -iter = 5; %number of voting iterations
  8 +rmax = 7; %maximum radius of the cell
  9 +ang_deg = 15.1; %half the angular range of the voting area
  10 +ang = ang_deg * pi / 180;
  11 +iter = 2; %number of voting iterations
13 12 t0 = 1.2; %threshold color
14 13 sigma = [4, 4, 2];
15   -final_t = 75;
16   -
  14 +% t = 0.1;
  15 +d_ang= ang / (iter);
17 16  
18 17 % ******** Testing parameters ******************************************
19   -p = [50, 20, 50] ;
20   -ps = [100, 100, 50] - 1;
21   -
22   -volfile = 'img\nissl-rat.vol';
23   -fid = fopen(volfile); % open the file that include the image
24   -S = fread(fid, 3, 'int32');
25   -X = S(1);
26   -Y = S(2);
27   -Z = S(3);
28   -
29   -% load the VOL data into a 2D matrix
30   -I = fread(fid,[X Y*Z], 'uint8');
31   -fclose(fid);
32   -
33   -%change this to a 3D matrix
34   -I = reshape(I, [X, Y, Z]);
35   -
36   -%invert the intensity
37   -I = 255 - I;
  18 +% p = [100, 50, 100];
  19 +% ps = [200, 200, 100];
  20 +ps = [150, 100, 25];
  21 +r = 7;
  22 +I = syn_Img(r , ps);
  23 +% volfile = 'img\nissl-rat.vol';
  24 +% fid = fopen(volfile); % open the file that include the image
  25 +% S = fread(fid, 3, 'int32');
  26 +% X = S(1);
  27 +% Y = S(2);
  28 +% Z = S(3);
  29 +%
  30 +% % load the VOL data into a 2D matrix
  31 +% I = fread(fid,[X Y*Z], 'uint8');
  32 +% fclose(fid);
  33 +%
  34 +% %change this to a 3D matrix
  35 +% I = (reshape(I, [X, Y, Z]));
  36 +%
  37 +% % invert the intensity
  38 +% I = 255 - I;
38 39  
39 40 %perform a gaussian blur
40   -I_blur = gauss_blur3d(I, sigma);
  41 +Iblur = gauss_blur3d(I, sigma);
41 42  
42   -% compute the gradient
43   -[Igrad_x, Igrad_y, Igrad_z] = gradient(I_blur);
  43 +%%crop out a small subregion of I and Iblur
  44 +% Iblur = Iblur(p(1):p(1)+ps(1)-1, p(2):p(2)+ps(2)-1, p(3):p(3)+ps(3)-1);
  45 +% I = I(p(1):p(1)+ps(1)-1, p(2):p(2)+ps(2)-1, p(3):p(3)+ps(3)-1);
44 46  
45   -%%crop out a small subregion of I
46   -Isub_x = Igrad_x(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3));
47   -Isub_y = Igrad_y(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3));
48   -Isub_z = Igrad_z(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3));
  47 +%
  48 +% compute the gradient
  49 +[Igrad_y, Igrad_x, Igrad_z] = gradient(Iblur);
49 50  
50 51 %calculate the gradient magnitude
51   -Imag = sqrt(Isub_x .^ 2 + Isub_y .^ 2 + Isub_z .^2);
  52 +Imag = sqrt(Igrad_x .^ 2 + Igrad_y .^ 2 + Igrad_z .^2);
  53 +I_theta1 = acos(Igrad_x./Imag);
  54 +I_theta2 = acos(Igrad_y./Imag);
  55 +I_theta3 = acos(Igrad_z./Imag);
52 56  
53 57 %set a threshold for the gradient magnitude
54 58 It = Imag > t0;
55 59  
  60 +%Set the boundaries of the threshold image to zero
  61 +It(1:rmax, :, :) = 0;
  62 +It(ps(1) - rmax:ps(1), :,:) = 0;
  63 +It(:, 1:rmax, :) = 0;
  64 +It(:, ps(2) - rmax:ps(2),:) = 0;
  65 +It(:, :, 1:rmax) = 0;
  66 +It(:,:, ps(3) - rmax:ps(3)) = 0;
  67 +
  68 +%get the indices of all of the nonzero values in the threshold image
  69 +% (voter positions)
  70 +[Itx,Ity,Itz] = ind2sub(size(It),find(It));
  71 +Vi = find(It);
  72 +nV = nnz(It);
  73 +
  74 +% create a meshgrid describing coordinates relative to the voter position
  75 +range = -rmax:rmax; %create an array of values between -rmax and rmax
  76 +[mx, my, mz] = meshgrid(range, range, range); %create a template describing local pixel position in a small cube
  77 +m_mag = sqrt(mx.^2 + my.^2 + mz.^2); %create a template describing the distance from the center of a small cube
56 78  
  79 +% create a mask for the voting area
  80 +M_dist = m_mag <= rmax; %mask for the voting area distance (all values < rmax from the center)
  81 +
  82 +%calculate the direction vector between a pixel and voter
  83 +LV_x = mx./m_mag;
  84 +LV_y = my./m_mag;
  85 +LV_z = mz./m_mag;
  86 +
  87 +%number of pixels in the voting area of each voter (initialize to zero)
  88 +validPixels = (zeros(nV,1));
  89 +
  90 +%indices of pixels in the voting area of each voter
  91 +% indices reference the 3D image
  92 +g_v_prime = (zeros(nV, (rmax^3)));
  93 +
  94 +%--------------Display current data-------------------------
57 95 subplot(3, 3, 1),
58   -imshow( squeeze( I(:, :, ceil(size(I, 3)/2)) ) ./ 255 );
59   -%colormap(gray);
  96 +imagesc(squeeze(I(:, :, ceil(size(I, 3)/2))));
60 97  
61 98 subplot(3, 3, 2),
62   -imshow( squeeze( I(:, ceil(size(I, 2)/2), :) ) ./ 255 );
  99 +imagesc(squeeze(I(:, ceil(size(I, 2)/2), :)));
63 100  
64 101 subplot(3, 3, 3),
65   -imshow( squeeze( I(ceil(size(I, 1)/2), :, :) ) ./ 255 );
66   -
  102 +imagesc(squeeze(I( ceil(size(I, 1)/2), :, :)));
  103 +%
67 104 subplot(3, 3, 4),
68   -imagesc( squeeze( Imag(:, :, ceil(size(Imag, 3)/2)) ) );
  105 +imagesc(squeeze(Iblur(:, :, ceil(size(Iblur, 3)/2))));
69 106  
70 107 subplot(3, 3, 5),
71   -imagesc( squeeze( Imag(:, ceil(size(Imag, 2)/2), :) ) );
  108 +imagesc(squeeze(Iblur(:, ceil(size(Iblur, 2)/2), :)));
72 109  
73 110 subplot(3, 3, 6),
74   -imagesc( squeeze( Imag(ceil(size(Imag, 1)/2), :, :) ) );
  111 +imagesc(squeeze(Iblur(ceil(size(Iblur, 1)/2), :, :)));
75 112  
76 113 subplot(3, 3, 7),
77   -imagesc( squeeze( It(:, :, ceil(size(It, 3)/2)) ) );
  114 +imagesc(squeeze(Imag(:, :, ceil(size(Imag, 3)/2))));
78 115  
79 116 subplot(3, 3, 8),
80   -imagesc( squeeze( It(:, ceil(size(It, 2)/2), :) ) );
  117 +imagesc(squeeze(Imag(:, ceil(size(Imag, 2)/2), :)));
81 118  
82 119 subplot(3, 3, 9),
83   -imagesc( squeeze( It(ceil(size(It, 1)/2), :, :) ) );
  120 +imagesc(squeeze(Imag(ceil(size(Imag, 1)/2), :, :)));
84 121  
85   -%
86   -% thresholding
87   -It_x = size(It,1);
88   -It_y = size(It,2);
89   -It_z = size(It,3);
90   -%
91   -It(1:rmax, :, :) = 0;
92   -It(It_x - rmax:It_x, :,:) = 0;
93   -S(:, 1:rmax, :) = 0;
94   -S(:, It_y - rmax:It_y,:) = 0;
95   -S(:, :, 1:rmax) = 0;
96   -S(:,:, It_z - rmax:It_z) = 0;
  122 +colormap(gray);
97 123  
98   -%
99   -[Itx,Ity,Itz] = ind2sub(size(It),find(It));
  124 +%% vote
  125 +tic;
  126 +%for each iteration (in iterative voting)
  127 +for itr = 1 : iter
100 128  
101   -nV = nnz(It);
  129 + %initialize the vote image to zero
  130 + Ivote = (zeros(size(I)));
  131 +
  132 + %for each voter (nonzero pixels in the threshold image It)
  133 + for v = 1: nV
  134 +
  135 + %get the cartesian coordinates of the voter v in the main image I
  136 + vx = Itx(v);
  137 + vy = Ity(v);
  138 + vz = Itz(v);
  139 + vi = Vi(v);
  140 +
  141 + %retreive the gradient magnitude at the voter position
  142 + %vmag = Imag(vx,vy,vz);
  143 + vmag = Imag(vi);
  144 +
  145 + %retrieve the gradient
  146 + gx = Igrad_x(vi);
  147 + gy = Igrad_y(vi);
  148 + gz = Igrad_z(vi);
  149 +
  150 + %calculate the gradient magnitude
  151 + dmag = sqrt (gx^2 + gy^2 + gz^2);
  152 +
  153 + %calculate the normalized gradient direction
  154 + dx = gx / dmag;
  155 + dy = gy / dmag;
  156 + dz = gz / dmag;
  157 +
  158 + %gdir_x = Igrad_x(vx, vy, vz) / dir_mag;
  159 + %gdir_y = Igrad_y(vx, vy, vz) / dir_mag;
  160 + %gdir_z = Igrad_z(vx, vy, vz) / dir_mag;
  161 +
  162 + %calculate the angle between the voter direction and the pixel direction
  163 + cos_diff = LV_x .* dx + LV_y .* dy + LV_z .* dz;
  164 + ang_diff = acos(cos_diff);
  165 +
  166 + %create an angular mask for the voting area
  167 + M_angle = cos_diff > cos(ang);
  168 +
  169 + %combine the two masks to mask out the voting angle
  170 + M = M_angle .* M_dist;
  171 +
  172 + % get the coordinates of each pixel in the final voter mask M
  173 + pi = find(M);
  174 +
  175 + %calculate the number of pixels in the voting region
  176 + npts = nnz(M);
  177 + validPixels(v) = npts;
  178 +
  179 + %convert every index in the voting area from a local 3D index to a global 3D index (into the original image I)
  180 + global_px = vx + mx(pi);
  181 + global_py = vy + my(pi);
  182 + global_pz = vz + mz(pi);
  183 +
  184 + %convert the global 3D index of each point into a global 1D index
  185 + %global_pi = sub2ind(ps, global_px, global_py, global_pz);
  186 + %global_pi = (global_pz-1)*ps(1)*ps(2) + (global_py-1)*ps(1) + global_px;
  187 + global_pi = sub2ind(ps, global_px, global_py, global_pz);
  188 +
  189 + g_v_prime (v, 1:npts) = global_pi;
  190 +
  191 +
  192 + Ivote( global_pi ) = Ivote( global_pi ) + vmag;
  193 +
  194 + end
  195 +
  196 + if itr ==1
  197 + Ivote1 = Ivote;
  198 +
  199 + elseif itr ==2
  200 + Ivote2 = Ivote;
  201 +
  202 + elseif itr ==3
  203 + Ivote3 = Ivote;
  204 +
  205 + elseif itr ==4
  206 + Ivote4 = Ivote;
  207 +
  208 + elseif itr == 5
  209 + Ivote5 = Ivote;
  210 + end
  211 + t_v1 = toc;
  212 + disp(['voting done. time =',num2str(t_v1)]);
  213 +
  214 + figure, imagesc(squeeze(Ivote(:, :, ceil(size(Ivote, 3)/2),:))); colormap(gray);
  215 +
  216 + % update the voting direction
  217 + tic;
  218 + for v = 1: nV
  219 + % coordinates of the current voter
  220 + vx = Itx(v);
  221 + vy = Ity(v);
  222 + vz = Itz(v);
  223 +
  224 + %get the local value of the voting image
  225 + local_Ivote = Ivote(g_v_prime(v,1:validPixels(v)));
  226 +
  227 + %find the index of the maximum value
  228 + [~, local_max_idx] = max(local_Ivote);
  229 +
  230 + %convert this into a global subscript
  231 + [gx, gy, gz] = ind2sub(size(Ivote), g_v_prime(v,local_max_idx));
  232 +
  233 + %compute the vector from the voter position to this position
  234 + dx = gx - vx;
  235 + dy = gy - vy;
  236 + dz = gz - vz;
  237 + Igrad_x(vx, vy, vz) = dx;
  238 + Igrad_y(vx, vy, vz) = dy;
  239 + Igrad_z(vx, vy, vz) = dz;
  240 +
  241 + end
  242 +
  243 + tdir1 = toc;
  244 + display (['updating dir done. time = ', num2str(tdir1)]);
  245 + ang = ang - d_ang;
  246 + end
  247 +
102 248  
  249 +%%
  250 +t = 10;
  251 +out = Ivote;
  252 +out(out<t) = 0;
  253 +% out(out>=t) = 255;
  254 +out = imregionalmax(out);
103 255  
104   -% create a meshgrid describing coordinates relative to the voter position
105   -range = -rmax:rmax;
106   -[mx, my, mz] = meshgrid(range, range, range);
107   -m_mag = sqrt(mx.^2 + my.^2 + mz.^2);
108   -%create a mask for the voting area
109   -M_dist = mx.^2 + my.^2 + mz.^2 < rmax^2;
  256 +out1(:,:,:,1) = mat2gray(Iblur);
  257 +out1(:,:,:,2) = mat2gray(out);
  258 +out1(:,:,:,3) = mat2gray(Iblur);
110 259  
111   -pxPerRow = size(I_blur,1);
112   -pxPerCol = size(I_blur,2);
113   -validPoints = zeros(nV,1);
114 260  
115   -g_v_prime = zeros(nV, ceil(rmax^2*phi/3));
116 261  
117   -%%
  262 +figure(2);
118 263  
119   -disp('done.');
120   -%% vote
121   -for itr = 1 : iter
122   - Ivote = zeros(size(Iblur));
123   - for v = 1: nV
124   - % coordinates of the current voter
125   - vx = Itx(v);
126   - vy = Ity(v);
127   - vz = Itz(v);
128   -
129   - vgrad = [Isub_x(vx,vy,vz), Isub_y(vx,vy,vz), Isub_z(vx,vy,vz)];
130   - %determine the gradient magnitude at the current voter location
131   - vmag = Imag(vx,vy,vz);
132   - ang_diff = zeros(2*rmax+1, 2*rmax+1, 2*rmax+1);
133   - for i = 1 : 2*rmax+1
134   - for j = 1 : 2*rmax+1
135   - for k = 1 : 2*rmax+1
136   - a = [mx(i,j,k), my(i,j,k), mz(i,j,k)];
137   - c = dot(vgrad, a);
138   - ang_diff(i,j,k) = acos(c/(m_mag(i,j,k)* vmag ));
139   - end
140   - end
141   - end
142   -
143   - M_diff = min(2*pi - ang_diff,ang_diff)<phi;
144   - %compute the final mask
145   - M = (M_dist .* M_diff);
146   -
147   - % get the coordinates of each pixel in the final mask
148   - [vx_prime,vy_prime,vz_prime] = ind2sub(size(M),find(M));
149   -
150   - %transform the local coordinates of the pixels in the voting region
151   - %to the global coordinates of the image
152   -
153   - npts = numel(vx_prime);
154   - validPoints(v) = npts;
155   -
156   - g_v_prime(v,1:npts) = vx + (vx_prime - (rmax + 1)) + (vy + (vy_prime - (rmax + 1))-1).*pxPerRow + (vz + (vz_prime - (rmax + 1))-1).*pxPerRow*pxPerCol;
157   -
158   - for n=1: npts
159   - %
160   - Ivote( g_v_prime(v,n)) = Ivote( g_v_prime(v,n)) + vmag;
161   - end
162   -
163   - end
164   -
165   -disp('voting done.');
166   - %% update the voting direction
167   -
168   - for v = 1: nV
169   - % coordinates of the current voter
170   - vx = sx(v);
171   - vy = sy(v);
172   - vz = sz(v);
173   -
174   - %get the local value of the voting image
175   - local_Ivote = Ivote(g_v_prime(v,1:validPoints(v)));
176   -
177   - %find the index of the maximum value
178   - [~, local_max_idx] = max(local_Ivote);
179   -
180   - %convert this into a global subscript
181   - gz = ceil(g_v_prime(v,local_max_idx)/(pxPerRow*pxPerCol)) ;
182   - gy = ceil((g_v_prime(v,local_max_idx)-(gz - 1)*pxPerRow*pxPerCol)/pxPerRow);
183   - gx = g_v_prime(v,local_max_idx)- pxPerRow*((gy - 1) + (gz - 1) * pxPerCol);
184   -
185   - %compute the vector from the voter position to this position
186   - new_vx = gx - vx;
187   - new_vy = gy - vy;
188   - new_vz = gz - vz;
189   - Igrad_x(vx,vy,vz) = new_vx;
190   - Igrad_y(vx,vy,vz) = new_vy;
191   - Igrad_z(vx,vy,vz) = new_vz;
192   - end
193   -end
194   -cell_center = Ivote;
195   -fido = fopen('out\outImg.vol', 'w+');
196   -fwrite(fido, cell_center);
197   -fclose(fido);
198   -t1 = toc
  264 +subplot(2, 3, 1),
  265 +imagesc(squeeze(Iblur(:, :, ceil(size(Iblur, 3)/2))));
  266 +
  267 +subplot(2, 3, 2),
  268 +imagesc(squeeze(Iblur(:, ceil(size(Iblur, 2)/2), :)));
  269 +
  270 +subplot(2, 3, 3),
  271 +imagesc(squeeze(Iblur( ceil(size(Iblur, 1)/2), :, :)));
  272 +
  273 +subplot(2, 3, 4),
  274 +imagesc( squeeze( out1(:, :, ceil(size(Ivote, 3)/2),:) ) );
  275 +
  276 +subplot(2, 3, 5),
  277 +imagesc(squeeze(out1(:, ceil(size(Ivote, 2)/2), :, :)));
  278 +
  279 +subplot(2, 3, 6),
  280 +imagesc(squeeze(out1( ceil(size(Ivote, 1)/2), :, :, :)));
  281 +
  282 +colormap(gray);
  283 +%%
  284 +% figure, imagesc(squeeze(Iblur(:, :, ceil(size(Iblur, 3)/2)))); colormap(gray);
  285 +% figure, imagesc(squeeze(Ivote(:, :, ceil(size(Ivote, 3)/2),:))); colormap(gray);
  286 +% figure, imagesc(squeeze(Iblur(:, ceil(size(Iblur, 2)/2), :))); colormap(gray);
  287 +% figure, imagesc(squeeze(I(:, ceil(size(Ivote, 2)/2), :))); colormap(gray);
  288 +% % figure, imagesc(squeeze(Iblur( ceil(size(Iblur, 1)/2), :, :))); colormap(gray);
  289 +% figure, imagesc(squeeze(Ivote( ceil(size(Ivote, 1)/2), :, :))); colormap(gray);
  290 +%
  291 +fid1 = fopen('ivote1.vol', 'w');
  292 +fwrite(fid1, Ivote1);
  293 +fclose(fid1);
  294 +
  295 +% fid0 = fopen('iblur.vol', 'w');
  296 +% fwrite(fid0, Iblur);
  297 +% fclose(fid0);
... ...
matlab/syn_Img.m 0 → 100644
  1 +
  2 +function I1 = syn_Img(r, ps)
  3 +
  4 +range = -r:r;
  5 +[cx, cy, cz] = meshgrid(range, range, range);
  6 +c1 = zeros(2*r+1,2*r+1,2*r+1);
  7 +c1(cx.^2 + cy.^2 + cz.^2 < r^2) = 255;
  8 +I1 = zeros(ps);
  9 +
  10 +sx = [8 36 91 45 50 76 85 67 51 21];
  11 +sy = [23 12 56 43 87 63 89 51 61 92];
  12 +sz = [8 10 9 14 17 10 11 15 13 10 11];
  13 +
  14 +for kk = 1:10
  15 +% set = [randi([r+1,ps(1)-r]) randi([r+1,ps(2)-r]) randi([r+1,ps(3)-r])];
  16 +% I1(set(1)-r:set(1)+r, set(2)-r:set(2)+r, set(3)-r:set(3)+r)= c1;
  17 + I1(sx(kk)-r:sx(kk)+r, sy(kk)-r:sy(kk)+r, sz(kk)-r:sz(kk)+r)= c1;
  18 +end
  19 +
  20 +% -------------------------------------------------------------------
  21 +
  22 +
  23 +
... ...