How to merge local maxima based on distance apart

2 ビュー (過去 30 日間)
Gabriel Nketiah
Gabriel Nketiah 2021 年 5 月 12 日
回答済み: Ayush 2024 年 6 月 4 日
I have detected a number of local maxima in an image (inplane resolution 0.5 x 0.5 mm).
I would like to merge local maxima that are less then a certian distance (say 5 mm) apart.

回答 (1 件)

Ayush
Ayush 2024 年 6 月 4 日
Hi,
To merge local maxima that are less than a certain distance apart in an image, you can use the "pdist" function to compute pairwise distances between local maxima and then merge those within a specified distance threshold. Refer to the example below for a better understanding:
% Create a simple image with local maxima
imageSize = [100, 100]; % Image size in pixels
image = zeros(imageSize);
% Add local maxima
localMaxima = [20, 30; 25, 35; 60, 80; 65, 85]; % Example coordinates of local maxima
for i = 1:size(localMaxima, 1)
image(localMaxima(i,1), localMaxima(i,2)) = 255;
end
% Plot original image with local maxima
subplot(1,2,1);
imshow(image, []);
hold on;
plot(localMaxima(:,2), localMaxima(:,1), 'ro', 'MarkerSize', 10);
title('Before Merging');
% Convert coordinates to millimeters (assuming 0.5x0.5 mm resolution)
localMaxima_mm = localMaxima * 0.5;
% Compute pairwise distances
D = pdist(localMaxima_mm, 'euclidean');
D_matrix = squareform(D); % Convert to square form
% Threshold for merging (in mm)
threshold = 5;
% Find indices of points to merge
[row, col] = find(D_matrix > 0 & D_matrix < threshold);
% Merge points by averaging their positions
mergedMaxima_mm = localMaxima_mm;
for i = 1:length(row)
if row(i) < col(i) % Handle each pair once
mergedMaxima_mm(row(i), :) = mean([localMaxima_mm(row(i), :); localMaxima_mm(col(i), :)], 1);
mergedMaxima_mm(col(i), :) = [NaN, NaN]; % Mark for removal
end
end
% Remove points marked for removal
mergedMaxima_mm(any(isnan(mergedMaxima_mm), 2), :) = [];
% Convert merged points back to pixel coordinates for plotting
mergedMaxima_px = mergedMaxima_mm * 2;
% Plot image after merging local maxima
subplot(1,2,2);
imshow(image, []);
hold on;
plot(mergedMaxima_px(:,2), mergedMaxima_px(:,1), 'go', 'MarkerSize', 5);
title('After Merging');
% Display original and merged points
fprintf('Original Points (mm):\n');
Original Points (mm):
disp(localMaxima_mm);
10.0000 15.0000 12.5000 17.5000 30.0000 40.0000 32.5000 42.5000
fprintf('Merged Points (mm):\n');
Merged Points (mm):
disp(mergedMaxima_mm);
11.2500 16.2500 31.2500 41.2500
The above example generates a plot before and after merging the local maxima. The red circles in the first subplot highlight the initial local maxima, while the green circles in the second subplot represent the new points after merging the local maxima. The merging takes place using the mean (average) of the positions of the two points.
For more information on the "pdist" function, refer to the below documentation:

製品

Community Treasure Hunt

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

Start Hunting!

Translated by