Commit c81508738f93816ed43adc8422c0ff05ab81147b
1 parent
e4c75a97
fix the matlab ivote3 code to works on the synthetic image.
Showing
2 changed files
with
38 additions
and
265 deletions
Show diff stats
Matlab_3D/main.m
@@ -6,11 +6,11 @@ total = tic; | @@ -6,11 +6,11 @@ total = tic; | ||
6 | 6 | ||
7 | % ******* Initialize voting parameters ************************************** | 7 | % ******* Initialize voting parameters ************************************** |
8 | rmax = 7; %maximum radius of the cell | 8 | rmax = 7; %maximum radius of the cell |
9 | -ang_deg = 15.1; %half the angular range of the voting area | 9 | +ang_deg = 25.1; %half the angular range of the voting area |
10 | ang = ang_deg * pi / 180; | 10 | ang = ang_deg * pi / 180; |
11 | -iter = 3; %number of voting iterations | 11 | +iter = 5; %number of voting iterations |
12 | t0 = 1.2; %threshold color | 12 | t0 = 1.2; %threshold color |
13 | -sigma = [4, 4, 2]; | 13 | +sigma = [1, 1, 1]; |
14 | % t = 0.1; | 14 | % t = 0.1; |
15 | d_ang= ang / (iter); | 15 | d_ang= ang / (iter); |
16 | 16 | ||
@@ -18,8 +18,7 @@ d_ang= ang / (iter); | @@ -18,8 +18,7 @@ d_ang= ang / (iter); | ||
18 | % p = [100, 50, 100]; | 18 | % p = [100, 50, 100]; |
19 | % ps = [200, 200, 100]; | 19 | % ps = [200, 200, 100]; |
20 | ps = [100, 50, 40]; | 20 | ps = [100, 50, 40]; |
21 | -r = 7; | ||
22 | -I = syn_Img(r , ps); | 21 | +I = syn_Img(rmax , ps); |
23 | % volfile = 'img\nissl-rat.vol'; | 22 | % volfile = 'img\nissl-rat.vol'; |
24 | % fid = fopen(volfile); % open the file that include the image | 23 | % fid = fopen(volfile); % open the file that include the image |
25 | % S = fread(fid, 3, 'int32'); | 24 | % S = fread(fid, 3, 'int32'); |
@@ -205,8 +204,6 @@ for itr = 1 : iter | @@ -205,8 +204,6 @@ for itr = 1 : iter | ||
205 | t_v1 = toc; | 204 | t_v1 = toc; |
206 | disp(['voting done. time =',num2str(t_v1)]); | 205 | disp(['voting done. time =',num2str(t_v1)]); |
207 | 206 | ||
208 | - figure, imagesc(squeeze(Ivote(:, :, ceil(size(Ivote, 3)/2),:))); colormap(gray); | ||
209 | - | ||
210 | % update the voting direction | 207 | % update the voting direction |
211 | tic; | 208 | tic; |
212 | for v = 1: nV | 209 | for v = 1: nV |
@@ -222,15 +219,12 @@ for itr = 1 : iter | @@ -222,15 +219,12 @@ for itr = 1 : iter | ||
222 | [~, local_max_idx] = max(local_Ivote); | 219 | [~, local_max_idx] = max(local_Ivote); |
223 | 220 | ||
224 | %convert this into a global subscript | 221 | %convert this into a global subscript |
225 | - [gx, gy, gz] = ind2sub(size(Ivote), g_v_prime(v,local_max_idx)); | 222 | + [g_px, g_py, g_pz] = ind2sub(size(Ivote), g_v_prime(v,local_max_idx)); |
226 | 223 | ||
227 | %compute the vector from the voter position to this position | 224 | %compute the vector from the voter position to this position |
228 | - dx = gx - vx; | ||
229 | - dy = gy - vy; | ||
230 | - dz = gz - vz; | ||
231 | - Igrad_x(vx, vy, vz) = dx; | ||
232 | - Igrad_y(vx, vy, vz) = dy; | ||
233 | - Igrad_z(vx, vy, vz) = dz; | 225 | + Igrad_x(vx, vy, vz) = g_px - vx; |
226 | + Igrad_y(vx, vy, vz) = g_py - vy; | ||
227 | + Igrad_z(vx, vy, vz) = g_pz - vz; | ||
234 | 228 | ||
235 | end | 229 | end |
236 | 230 | ||
@@ -241,7 +235,7 @@ for itr = 1 : iter | @@ -241,7 +235,7 @@ for itr = 1 : iter | ||
241 | 235 | ||
242 | 236 | ||
243 | %% | 237 | %% |
244 | -t = 10; | 238 | +t = 2500; |
245 | out = Ivote; | 239 | out = Ivote; |
246 | out(out<t) = 0; | 240 | out(out<t) = 0; |
247 | % out(out>=t) = 255; | 241 | % out(out>=t) = 255; |
@@ -250,10 +244,10 @@ out = imregionalmax(out); | @@ -250,10 +244,10 @@ out = imregionalmax(out); | ||
250 | out1(:,:,:,1) = mat2gray(Iblur); | 244 | out1(:,:,:,1) = mat2gray(Iblur); |
251 | out1(:,:,:,2) = mat2gray(out); | 245 | out1(:,:,:,2) = mat2gray(out); |
252 | out1(:,:,:,3) = mat2gray(Iblur); | 246 | out1(:,:,:,3) = mat2gray(Iblur); |
247 | +% out = out1; | ||
253 | 248 | ||
254 | 249 | ||
255 | - | ||
256 | -figure(2); | 250 | +figure(4); |
257 | 251 | ||
258 | subplot(2, 3, 1), | 252 | subplot(2, 3, 1), |
259 | imagesc(squeeze(Iblur(:, :, ceil(size(Iblur, 3)/2)))); | 253 | imagesc(squeeze(Iblur(:, :, ceil(size(Iblur, 3)/2)))); |
@@ -282,19 +276,30 @@ colormap(gray); | @@ -282,19 +276,30 @@ colormap(gray); | ||
282 | % % figure, imagesc(squeeze(Iblur( ceil(size(Iblur, 1)/2), :, :))); colormap(gray); | 276 | % % figure, imagesc(squeeze(Iblur( ceil(size(Iblur, 1)/2), :, :))); colormap(gray); |
283 | % figure, imagesc(squeeze(Ivote( ceil(size(Ivote, 1)/2), :, :))); colormap(gray); | 277 | % figure, imagesc(squeeze(Ivote( ceil(size(Ivote, 1)/2), :, :))); colormap(gray); |
284 | % | 278 | % |
285 | -fid0 = fopen('iblur.vol', 'w'); | ||
286 | -fwrite(fid0, Iblur); | ||
287 | -fclose(fid0); | ||
288 | - | ||
289 | -fid1 = fopen('ivote1.vol', 'w'); | ||
290 | -fwrite(fid1, Ivote1); | ||
291 | -fclose(fid1); | ||
292 | - | ||
293 | -fid2 = fopen('ivote2.vol', 'w'); | ||
294 | -fwrite(fid2, Ivote2); | ||
295 | -fclose(fid2); | ||
296 | - | ||
297 | -fid3 = fopen('ivote3.vol', 'w'); | ||
298 | -fwrite(fid3, Ivote3); | ||
299 | -fclose(fid3); | ||
300 | - | 279 | +% fid0 = fopen('D:\ivote3_files\iblur.vol', 'w'); |
280 | +% fwrite(fid0, Iblur); | ||
281 | +% fclose(fid0); | ||
282 | +% | ||
283 | +% fid1 = fopen('D:\ivote3_files\ivote1.vol', 'w'); | ||
284 | +% fwrite(fid1, Ivote1); | ||
285 | +% fclose(fid1); | ||
286 | +% | ||
287 | +% fid2 = fopen('D:\ivote3_files\ivote2.vol', 'w'); | ||
288 | +% fwrite(fid2, Ivote2); | ||
289 | +% fclose(fid2); | ||
290 | +% | ||
291 | +% fid3 = fopen('D:\ivote3_files\ivote3.vol', 'w'); | ||
292 | +% fwrite(fid3, Ivote3); | ||
293 | +% fclose(fid3); | ||
294 | +% | ||
295 | +% fid4 = fopen('D:\ivote3_files\ivote4.vol', 'w'); | ||
296 | +% fwrite(fid4, Ivote4); | ||
297 | +% fclose(fid4); | ||
298 | +% | ||
299 | +% fid5 = fopen('D:\ivote3_files\ivote5.vol', 'w'); | ||
300 | +% fwrite(fid5, Ivote5); | ||
301 | +% fclose(fid5); | ||
302 | +% | ||
303 | +% fid10 = fopen('D:\ivote3_files\ivote10.vol', 'w'); | ||
304 | +% fwrite(fid10, Ivote); | ||
305 | +% fclose(fid10); |
Matlab_3D/old-matlab.m deleted
1 | -clc; | ||
2 | -clear; | ||
3 | -disp('***************** NEW RUN *********************'); | ||
4 | -total = tic; | ||
5 | - | ||
6 | - | ||
7 | -% ******* Initialize voting parameters ************************************** | ||
8 | -rmax = 9; %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 = 1; %number of voting iterations | ||
12 | -t0 = 1.2; %threshold color | ||
13 | -sigma = [4, 4, 2]; | ||
14 | -% t = 10; | ||
15 | -d_ang= ang / (iter); | ||
16 | - | ||
17 | -% ******** Testing parameters ****************************************** | ||
18 | -p = [100, 50, 100] ; | ||
19 | -ps = [50, 50, 25] - 1; | ||
20 | -% p = [100, 100, 100] ; | ||
21 | -% ps = [300, 300, 150] - 1; | ||
22 | - | ||
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 = single(reshape(I, [X, Y, Z])); | ||
36 | - | ||
37 | -% invert the intensity | ||
38 | -I = 255 - I; | ||
39 | - | ||
40 | -%perform a gaussian blur | ||
41 | -I_blur = gauss_blur3d(I, sigma); | ||
42 | - | ||
43 | -% compute the gradient | ||
44 | -[Igrad_x, Igrad_y, Igrad_z] = gradient(I_blur); | ||
45 | - | ||
46 | -%%crop out a small subregion of I | ||
47 | -Isub_x = Igrad_x(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3)); | ||
48 | -Isub_y = Igrad_y(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3)); | ||
49 | -Isub_z = Igrad_z(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3)); | ||
50 | - | ||
51 | -%calculate the gradient magnitude | ||
52 | -Imag = sqrt(Isub_x .^ 2 + Isub_y .^ 2 + Isub_z .^2); | ||
53 | -I_theta = acos(Isub_z./Imag); | ||
54 | -I_phi = atan(Isub_y./Isub_x); | ||
55 | - | ||
56 | - | ||
57 | -%set a threshold for the gradient magnitude | ||
58 | -It = Imag > t0; | ||
59 | - | ||
60 | -% | ||
61 | -% thresholding | ||
62 | -It_x = size(It,1); | ||
63 | -It_y = size(It,2); | ||
64 | -It_z = size(It,3); | ||
65 | -% | ||
66 | -It(1:rmax, :, :) = 0; | ||
67 | -It(It_x - rmax:It_x, :,:) = 0; | ||
68 | -It(:, 1:rmax, :) = 0; | ||
69 | -It(:, It_y - rmax:It_y,:) = 0; | ||
70 | -It(:, :, 1:rmax) = 0; | ||
71 | -It(:,:, It_z - rmax:It_z) = 0; | ||
72 | - | ||
73 | -% | ||
74 | -[Itx,Ity,Itz] = (ind2sub(size(It),find(It))); | ||
75 | -Itx = single(Itx); | ||
76 | -Ity = single(Ity); | ||
77 | -Itz = single(Itz); | ||
78 | -nV = nnz(It); | ||
79 | - | ||
80 | - | ||
81 | -% create a meshgrid describing coordinates relative to the voter position | ||
82 | -range = single(-rmax):single(rmax); | ||
83 | -[mx, my, mz] = (meshgrid(range, range, range)); | ||
84 | -m_mag = sqrt(mx.^2 + my.^2 + mz.^2); | ||
85 | - | ||
86 | -% create a mask for the voting area | ||
87 | -M_dist = mx.^2 + my.^2 + mz.^2 < rmax^2; | ||
88 | -M_theta = acos(mz./m_mag); | ||
89 | -M_phi = atan(my./mx); | ||
90 | -M_phi (my ==0 & mx ==0) = 0; | ||
91 | -pxPerRow = single(size(It,1)); | ||
92 | -pxPerCol = single(size(It,2)); | ||
93 | -validPoints = single(zeros(nV,1)); | ||
94 | - | ||
95 | -% g_v_prime = zeros(nV, ceil(rmax^2*ang/3)); | ||
96 | -g_v_prime = single(zeros(nV, (rmax^3))); | ||
97 | - | ||
98 | - | ||
99 | - | ||
100 | -disp('first part done.'); | ||
101 | -%% vote | ||
102 | -tic; | ||
103 | - for itr = 1 : iter | ||
104 | - | ||
105 | - Ivote = single(zeros(size(It))); | ||
106 | - for v = 1: 1 | ||
107 | - | ||
108 | -% | ||
109 | - % coordinates of the current voter | ||
110 | - vx = Itx(v); | ||
111 | - vy = Ity(v); | ||
112 | - vz = Itz(v); | ||
113 | -% | ||
114 | - vtheta= I_theta(vx,vy,vz); | ||
115 | - vphi = I_phi(vx,vy,vz); | ||
116 | - vmag = Imag(vx,vy,vz); | ||
117 | -% ang_diff = single(zeros([2*rmax+1 2*rmax+1 2*rmax+1])); | ||
118 | -% for i=1: 2*rmax +1 | ||
119 | -% for j=1: 2*rmax+1 | ||
120 | -% for k = 1:2*rmax+1 | ||
121 | -% ang_diff(i,j,k) = acos(dot([Isub_x(vx,vy,vz) Isub_y(vx,vy,vz) Isub_z(vx,vy,vz)], [mx(i,j,k) my(i,j,k) mz(i,j,k)])/(vmag*norm([mx(i,j,k) my(i,j,k) mz(i,j,k)]))); | ||
122 | -% end | ||
123 | -% end | ||
124 | -% end | ||
125 | - ang_diff = acos(((sin(M_theta).*sin(vtheta)).*cos(vphi - M_phi)) + cos(M_theta).*cos(vtheta)); | ||
126 | - M_diff = min(2*pi - ang_diff,ang_diff)<ang; | ||
127 | -% M_diff = abs(ang_diff)<ang; | ||
128 | - %compute the final mask | ||
129 | - M = single(M_dist .* M_diff); | ||
130 | -% | ||
131 | - % get the coordinates of each pixel in the final mask | ||
132 | - [vx_prime,vy_prime,vz_prime] = ind2sub(size(M),find(M)); | ||
133 | - | ||
134 | - %transform the local coordinates of the pixels in the voting region | ||
135 | - %to the global coordinates of the image | ||
136 | - | ||
137 | - npts = numel(vx_prime); | ||
138 | - validPoints(v) = npts; | ||
139 | - | ||
140 | - g_v_prime(v,1:npts) = vx + (single(vx_prime) - single(rmax + 1)) + (vy + (single(vy_prime) - single(rmax + 1))-1).*single(pxPerRow) + (vz + (single(vz_prime) - single(rmax + 1))-1).*single(pxPerRow)*single(pxPerCol); | ||
141 | - | ||
142 | - for n=1: npts | ||
143 | - % | ||
144 | - Ivote( g_v_prime(v,n)) = Ivote( single(g_v_prime(v,n))) + vmag; | ||
145 | - end | ||
146 | - | ||
147 | - end | ||
148 | - | ||
149 | - | ||
150 | - t_v1 = toc; | ||
151 | - disp(['voting done. time =',num2str(t_v1)]); | ||
152 | - | ||
153 | - | ||
154 | - % update the voting direction | ||
155 | - tic; | ||
156 | - for v = 1: nV | ||
157 | - % coordinates of the current voter | ||
158 | - vx = single(Itx(v)); | ||
159 | - vy = single(Ity(v)); | ||
160 | - vz = single(Itz(v)); | ||
161 | - | ||
162 | - %get the local value of the voting image | ||
163 | - local_Ivote = Ivote(g_v_prime(v,1:validPoints(v))); | ||
164 | - | ||
165 | - %find the index of the maximum value | ||
166 | - [~, local_max_idx] = max(local_Ivote); | ||
167 | - | ||
168 | - %convert this into a global subscript | ||
169 | - gz = ceil(g_v_prime(v,local_max_idx)/(pxPerRow*pxPerCol)) ; | ||
170 | - gy = ceil((g_v_prime(v,local_max_idx)-(gz - 1)*pxPerRow*pxPerCol)/pxPerRow); | ||
171 | - gx = g_v_prime(v,local_max_idx)- pxPerRow*((gy - 1) + (gz - 1) * pxPerCol); | ||
172 | - | ||
173 | - %compute the vector from the voter position to this position | ||
174 | - up_vx = gx - vx; | ||
175 | - up_vy = gy - vy; | ||
176 | - up_vz = gz - vz; | ||
177 | - I_theta(vx,vy,vz) = acos(up_vz/sqrt(up_vx^2 + up_vy^2 + up_vz^2)); | ||
178 | - I_phi(vx,vy,vz) = atan(up_vy/up_vx); | ||
179 | - end | ||
180 | - | ||
181 | - tdir1 = toc; | ||
182 | - display (['updating dir done. time = ', num2str(tdir1)]); | ||
183 | - ang = ang - d_ang; | ||
184 | - end | ||
185 | - | ||
186 | - | ||
187 | -%% | ||
188 | -out1(:,:,:,1) = mat2gray( I(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3))); | ||
189 | -out1(:,:,:,2) = mat2gray(Ivote); | ||
190 | -out1(:,:,:,3) = mat2gray(I(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3))); | ||
191 | - | ||
192 | -subplot(3, 3, 1), | ||
193 | -imagesc( squeeze( out1(:, :, ceil(size(out1, 3)/2),:) ) ); | ||
194 | - | ||
195 | -subplot(3, 3, 2), | ||
196 | -imagesc( squeeze( out1(:, ceil(size(out1, 2)/2), :,:) ) ); | ||
197 | - | ||
198 | -subplot(3, 3, 3), | ||
199 | -imagesc( squeeze( out1(ceil(size(out1, 1)/2), :, :,:) ) ); | ||
200 | - | ||
201 | -t = 10; | ||
202 | -cell_center = Ivote; | ||
203 | -cell_center(cell_center<t) =0; | ||
204 | -cell_center(cell_center>=t) = 255; | ||
205 | -% cell_center = imregionalmax(cell_center); | ||
206 | - | ||
207 | -out2(:,:,:,1) = mat2gray( I(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3))); | ||
208 | -out2(:,:,:,2) = mat2gray(cell_center); | ||
209 | -out2(:,:,:,3) = mat2gray(I(p(1):p(1)+ps(1), p(2):p(2)+ps(2), p(3):p(3)+ps(3))); | ||
210 | - | ||
211 | - | ||
212 | -subplot(3, 3, 4), | ||
213 | -imagesc( squeeze( out2(:, :, ceil(size(out2, 3)/2),:) ) ); | ||
214 | - | ||
215 | -subplot(3, 3, 5), | ||
216 | -imagesc( squeeze( out2(:, ceil(size(out2, 2)/2), :,:) ) ); | ||
217 | - | ||
218 | -subplot(3, 3, 6), | ||
219 | -imagesc( squeeze( out2(ceil(size(out2, 1)/2), :, :,:) ) ); | ||
220 | - | ||
221 | -colormap(gray); | ||
222 | -subplot(3, 3, 7), | ||
223 | -imagesc( squeeze( Imag(:, :, ceil(size(Imag, 3)/2),:) ) ); | ||
224 | - | ||
225 | -subplot(3, 3, 8), | ||
226 | -imagesc( squeeze( Imag(:, ceil(size(Imag, 2)/2), :,:) ) ); | ||
227 | - | ||
228 | -subplot(3, 3, 9), | ||
229 | -imagesc( squeeze( Imag(ceil(size(Imag, 1)/2), :, :,:) ) ); | ||
230 | - | ||
231 | - | ||
232 | - |