Commit da849ea2cf240713b77e81b2b16fdfd30389bbf7
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); | ... | ... |
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 | + | ... | ... |