Найдите количество пятен на зашумленном изображении

Я хочу автоматически подсчитывать количество пятен на этом типе изображения, где пятна расположены очень близко друг к другу, так что многие из них рассматриваются как одно пятно:

разбросанные пятна: очень близко друг к другу

Я подумал об использовании функции / алгоритма локальных максимумов MATLAB, например imregionalmaxima, но это возвращает количество пикселей (единиц в двоичной матрице) с максимальными значениями. Я только хочу измерить количество белых пятен, содержащихся в черном цикле.

Я также нашел здесь эту тему: Как посчитать число пятен на этом изображении? и использовали программу ImageJ. Он не может обнаружить пятна, мне кажется, он также определяет пиксели с максимальными значениями.


person tselios    schedule 23.11.2015    source источник


Ответы (3)


Еще один простой способ подсчитать количество белых пятен на изображении - сначала преобразовать изображение в черно-белое, удалить белую рамку, а затем подсчитать, сколько их осталось. Используйте bwlabel и определите значение, отображаемое во второй выходной переменной. Чтобы очистить белую рамку, используйте imclearborder. Кстати, это предполагает, что у вас есть панель инструментов обработки изображений:

%// Read image directly from StackOverflow
im = im2bw(imread('http://i.stack.imgur.com/9hU5O.png'));

%// Remove white border surrounding image
im = imclearborder(im);

%// Count how many white spots there are
[~,num] = bwlabel(im);

Я получил:

>> num

num =

    18

Теперь в случае вашего реального примера у вас есть несколько зашумленных пикселей. Есть несколько способов избавиться от этих изолированных полос. Мне удалось использовать морфологическое отверстие с квадратным структурирующим элементом 5 x 5. Как только вы это сделаете, это удалит все зашумленные пиксели, имеющие площадь менее 5 x 5, и оставит только любую форму, площадь которой больше, чем форма 5 x 5. Используйте комбинацию imopen и _ 6_, чтобы помочь вам в этом:

%// Read in the new image and convert to black and white
im = im2bw(imread('http://i.stack.imgur.com/HCvAa.png'));

%// Clear the border
im = imclearborder(im);

%// Define the structuring element
se = strel('square', 5);

%// Open the image
out = imopen(im, se);

%// Now count the objects
[~,num] = bwlabel(out);

Я получил:

>> num

num =

    18

Кроме того, если вам интересно, вот как выглядит очищенное изображение:

>> imshow(out);

введите здесь описание изображения

Эта обработка была произведена на новом изображении, которое вы разместили, и вы можете видеть, что зашумленные белые пиксели были удалены из-за операции открытия.

person rayryeng    schedule 23.11.2015
comment
плюс один для imclearborder ()! - person lhcgeneva; 23.11.2015
comment
алгоритм работает для черного цикла с белыми пятнами, но не для цикла с белым шумом, который я загрузил сейчас. как я могу считать пятна и игнорировать белый шум? Алгоритм дает 407 объектов - person tselios; 23.11.2015
comment
@tselios Вам нужно удалить шум. Отредактирую свой пост. Было бы действительно полезно, если бы вы разместили реальный пример, с которым работаете. Меня раздражает, что я продолжаю редактировать свой ответ. - person rayryeng; 23.11.2015
comment
@tselios Отредактировано. Проверить это. - person rayryeng; 23.11.2015
comment
@rayryeng У меня также есть случай, когда пятна расположены очень близко друг к другу, поэтому они считаются одним из программных. Как этого избежать? Добавлен пример в основной вопрос - person tselios; 24.11.2015
comment
Ты сам по себе. Устали от ваших постоянных обновлений. - person rayryeng; 24.11.2015

Попробуйте это (требуется набор инструментов для обработки изображений):

i = imread('9hU5O.png');
bw = im2bw(i);
cc = bwconncomp(imclearborder(bw), 4);

См. Также здесь.

Выход:

cc = 

    Connectivity: 4
       ImageSize: [381 423]
      NumObjects: 18
    PixelIdxList: {1x18 cell}

Изменить: теперь включая imclearborder () Rayryeng.

person lhcgeneva    schedule 23.11.2015
comment
Плюс 1 из-за imclearborder тоже: D - person rayryeng; 23.11.2015

Для этой задачи вам потребуется маркировка подключенных компонентов.

В ImageJ это делается с помощью Команда "Анализировать частицы".

Диалог анализа частиц

Результат можно записать в таблицу или отобразить в виде контуров частиц.

При работе с реальными изображениями обычно рекомендуется предварительно обрабатывать изображения перед сегментацией, например убрать шум. Если это невозможно и у вас есть двоичное изображение, которое содержит несовершенную сегментацию, вы можете использовать морфологические операции (например, Erode, Dilate, Open, Close), чтобы отбросить тонкие линии и отдельные пиксели. Следующий Javascript поможет вам начать работу. Просто запустите его из редактора скриптов.

importClass(Packages.ij.IJ);

imp = IJ.openImage("http://i.stack.imgur.com/X8Bou.png");

IJ.run(imp, "8-bit", "");
IJ.run(imp, "Open", "");
IJ.run(imp, "Watershed", "");

IJ.run(imp, "Analyze Particles...", "size=50-1000 show=Outlines display exclude clear");
imp.show();

Вот результат:

Результат анализа частиц

person Jan Eglinger    schedule 23.11.2015