Чтобы сгруппировать точки, можно просто сгладить изображение в достаточной степени, чтобы смазать их вместе.Точки, которые расположены близко друг к другу (относительно размера ядра размытия), будут объединены, точки, которые находятся дальше друг от друга, не будут.
Лучший способ сгладить изображение - использовать фильтр Гаусса .MATLAB реализует это с помощью функции imgaussfilt
с 2015a.Для более старых версий MATLAB (или Octave, как я здесь использую) вы можете использовать fspecial
и imfilter
.Но вы должны быть осторожны, потому что fspecial
позволяет действительно легко создать ядро, которое вовсе не является гауссовым ядром .Это причина того, что этот метод устарел сейчас, и была создана функция imgaussfilt
.
Вот некоторый код, который делает это:
% Load image
img = imread('https://i.stack.imgur.com/NIcb9.png');
img = rgb2gray(img);
% Threshold to get dots
dots = img > 127; % doesn't matter, this case is trivial
% Group dots
% smooth = imgaussfilt(img,10); % This works for newer MATLABs
g = fspecial("gaussian",6*10+1,10);
smooth = imfilter(img,g,'replicate'); % I'm using Octave here, it doesn't yet implement imgaussfilt
% Find an appropriate threshold for dot density
regions = smooth > 80; % A smaller value makes for fewer isolated points
% Dots within regions
newDots = dots & regions;
Для определения объектов, которые находятся внутритой же области, просто пометьте изображение regions
и умножьте на изображение dots
:
% Label regions
regions = bwlabel(regions);
% Label dots within regions
newDots = regions .* dots;
% Display
imshow(label2rgb(newDots,'jet','k'))
![labeled dots](https://i.stack.imgur.com/z7GTv.png)