Calculate the maximum distance between two perimeter of 3d binary masks in a straight line in the z-direction.

4 次查看(过去 30 天)
Hello everyone,
For a project I am attempting to calculate the maximum distance between an ITV and a PTV in the x, y and z-direction. For this first I have made a code with two synthetic 3d binary masks. For the x-direction and the y-direction I was able to get a correct value. For the y-direction it is 1 and x is 2. For the z-direction for the masks I created the distance should be 3. However I am not able to figure it out. Maybe some of you can help. The entire code is down below, the z-direction that I tried is at the bottom.
%% X-direction (Loop)
% Create the two binary masks
mask1 = zeros(10,10,10);
mask1(4:6,4:6,4:6) = 1;
mask1 = bwperim(mask1);
mask2 = zeros(10,10,10);
mask2(2:7,2:8,3:9) = 1; %gaat hier dus om de rows
mask2 = bwperim(mask2);
% Initialize the maximum distances
max_distances = zeros(size(mask1,1), size(mask1,2), size(mask1,3));
% Loop over each slice in the z-direction
for k = 1:size(mask1,3)
% Find the current slices
slice1 = mask1(:,:,k);
slice2 = mask2(:,:,k);
% Find the rows in which slice1 and slice2 have non-zero elements
[row1, col1] = find(slice1);
[row2, col2] = find(slice2);
% Loop over each point in slice1 that is 1
for i = 1:numel(row1)
% Initialize the maximum distance to a point in slice2 that is 1
max_distance = -Inf;
% Loop over each point in slice2 that is 1
for j = 1:numel(row2)
% Check if the row of the current point in slice2 is the same as
% the row of the current point in slice1
if row2(j) == row1(i)
% Calculate the x-distance between the two points
x_distance = col2(j) - col1(i);
% Check if the distance is positive and less than the maximum
% distance found so far, and that there are no points of slice1
% between the two points
if x_distance > 0 && x_distance > max_distance && ~any(slice1(row1(i),col1(i)+1:col2(j)-1))
% Update the maximum distance
max_distance = x_distance;
end
end
end
% Store the maximum distance for the current point in slice1
max_distances(row1(i), col1(i), k) = max_distance;
end
end
% Find the maximum distance over all points and all slices in slice1
max_distance_x = max(max(max_distances(:,:,:)));
max_distance_value_x = max(max_distance_x);
disp(['The maximum distance between the two binary images in the x-direction is ', num2str(max_distance_value_x), '.']);
%% Y-direction (Loop)
% Create the two binary masks
mask1 = zeros(10,10,10);
mask1(4:6,4:6,4:6) = 1;
mask1 = bwperim(mask1);
mask2 = zeros(10,10,10);
mask2(2:7,2:8,3:9) = 1; %gaat hier dus om de rows
mask2 = bwperim(mask2);
% Initialize the maximum distances
max_distances = zeros(size(mask1,1), size(mask1,2), size(mask1,3));
% Loop over each slice in the y-direction
for j = 1:size(mask1,2)
% Find the current slices
slice1 = mask1(:,j,:);
slice2 = mask2(:,j,:);
% Find the columns in which slice1 and slice2 have non-zero elements
[row1, col1] = find(slice1);
[row2, col2] = find(slice2);
% Loop over each point in slice1 that is 1
for i = 1:numel(row1)
% Initialize the maximum distance to a point in slice2 that is 1
max_distance = -Inf;
% Loop over each point in slice2 that is 1
for k = 1:numel(row2)
% Check if the column of the current point in slice2 is the same as
% the column of the current point in slice1
if col2(k) == col1(i)
% Calculate the y-distance between the two points
y_distance = row2(k) - row1(i);
% Check if the distance is positive and less than the maximum
% distance found so far, and that there are no points of slice1
% between the two points
if y_distance > 0 && y_distance > max_distance && ~any(slice1(row1(i)+1:row2(k)-1,col1(i)))
% Update the maximum distance
max_distance = y_distance;
end
end
end
% Store the maximum distance for the current point in slice1
max_distances(row1(i), j) = max(max_distances(row1(i), j), max_distance);
end
end
% Find the maximum distance over all points and all slices in slice1
max_distance_y = max(max(max_distances(:)));
disp(['The maximum distance between the two binary images in the y-direction is ', num2str(max_distance_y), '.']);
%% Z-direction (loop)
% Create the two binary masks
mask1 = zeros(10,10,10);
mask1(4:6,4:6,4:6) = 1;
mask1 = bwperim(mask1);
mask2 = zeros(10,10,10);
mask2(2:7,2:8,3:9) = 1; %gaat hier dus om de rows
mask2 = bwperim(mask2);
% Initialize the maximum distances
max_distances = zeros(size(mask1,1), size(mask1,2), size(mask1,3));
% Loop over each slice in the z-direction
for j = 1:size(mask1,3)
% Find the current slices
slice1 = mask1(j,:,:);
slice2 = mask2(j,:,:);
% Find the columns in which slice1 and slice2 have non-zero elements
[row1, col1] = find(slice1);
[row2, col2] = find(slice2);
% Loop over each point in slice1 that is 1
for i = 1:numel(row1)
% Initialize the maximum distance to a point in slice2 that is 1
max_distance = -Inf;
% Loop over each point in slice2 that is 1
for k = 1:numel(row2)
% Check if the column of the current point in slice2 is the same as
% the column of the current point in slice1
if col2(k) == col1(i)
% Calculate the z-distance between the two points
z_distance = row2(k) - row1(i);
% Check if the distance is positive and less than the maximum
% distance found so far, and that there are no points of slice1
% between the two points
if z_distance > 0 && z_distance > max_distance && ~any(slice1(row1(i)+1:row2(k)-1,col1(i)))
% Update the maximum distance
max_distance = z_distance;
end
end
end
% Store the maximum distance for the current point in slice1
max_distances(row1(i), j) = max(max_distances(row1(i), j), max_distance);
end
end
% Find the maximum distance over all points and all slices in slice1
max_distance_z = max(max(max_distances(:)));
disp(['The maximum distance between the two binary images in the z-direction is ', num2str(max_distance_z), '.']);

回答(1 个)

Himanshu
Himanshu 2023-4-25
Hello Sander,
As per my understanding, you are facing an error while calculating the maximum distance between an ITV (Internal Target Volume) and a PTV (Planning Target Volume) in three dimensions (x, y, and z).
The issue you are facing can be eliminated by making the following changes in the z-direction code:
  1. Remove the loop for "j = 1:size(mask1,3)" as it is unnecessary.
  2. Replace the existing nested loops with two new loops, one for the rows (i-direction) and one for the columns (j-direction).
  3. Modify the code within the new nested loops to find the indices where "mask1" and "mask2" have non-zero elements in the current row and column.
  4. Adjust the conditions in the loop and distance calculation to properly account for the z-direction.
% Loop over each row in the i-direction
for i = 1:size(mask1,1)
% Loop over each column in the j-direction
for j = 1:size(mask1,2)
% Find the indices in which mask1 and mask2 have non-zero elements in the current row and column
idx1 = find(mask1(i,j,:));
idx2 = find(mask2(i,j,:));
% rest of the code remains the same
end
end
I hope this helps.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by