Как сгруппировать пиксели в капли в Matlab? - PullRequest
0 голосов
/ 20 мая 2018

У меня есть это изображение с белыми точками на темном фоне:

enter image description here

Я хочу сгруппировать пиксели, которые находятся рядом, в один шарик.На этом изображении это будет означать, что на изображении будет два шарика, один для пикселей вверху и один для пикселей внизу.Любые пиксели, которые не слишком близки к этим двум каплям, должны быть заменены на цвет фона (необходимо указать пороговое значение, чтобы выбрать, какие пиксели попадают в капли, а какие слишком далеко).Как мне это сделать?Любая функция Matlab, которую можно использовать?

1 Ответ

0 голосов
/ 24 мая 2018

Чтобы сгруппировать точки, можно просто сгладить изображение в достаточной степени, чтобы смазать их вместе.Точки, которые расположены близко друг к другу (относительно размера ядра размытия), будут объединены, точки, которые находятся дальше друг от друга, не будут.

Лучший способ сгладить изображение - использовать фильтр Гаусса .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

...