Подсчет колоний на чашке Петри

У меня есть куча чашек Петри, наполненных точками, которые я бы хотел сосчитать в Matlab. Можно ли это сделать надежно и в пакетах?

например. Эта пластинка имеет 352 колонии

enter image description here

Я пробовал ImageJ, но мне нужно сделать немного обрезки с границы и получить переменные результаты.

Есть ли у вас какие-либо предложения?

Ответ 1

Мой подход к этой проблеме заключается в следующем:

  • Используйте преобразование Hough для определения кругов, соответствующих чашке Петри.
  • Глобальное пороговое значение с методом Otsu, ограниченное блюдом.
  • Подсчитайте колонии как региональные максимумы исходного изображения, которые представлены в сегментированном изображении.

Эта панель обмена файлами предоставляет нам рабочий цикл преобразования Hough. Вещи довольно прямолинейны:

function [count,colonies,bw] = colony_count(I)

I = rgb2gray(im2double(I)); %# Color-to-gray conversion.
[m,n] = size(I);

%# Uncomment this if you have might have some images with light background
%# and dark colonies. It will invert any that seem that way.
%#if graythresh(I) < 0.5
%#    I = imcomplement(I);
%#end

bw = I > graythresh(I); %# Otsu method.
radii = 115:1:130; %# Approx. size of plate, narrower range = faster.
h = circle_hough(bw,radii,'same','normalise'); %# Circular HT.
peaks = circle_houghpeaks(h, radii, 'npeaks', 10); %# Pick top 10 circles.

roi = true(m,n);
for peak = peaks
    [x, y] = circlepoints(peak(3)); %# Points on the circle of this radius.
    x = x + peak(1); %# Translate the circle appropriately.
    y = y + peak(2);
    roi = roi & poly2mask(x,y,m,n); %# Cumulative union of all circles.
end

%# Restrict segmentation to dish. The erosion is to make sure no dish pixels
%# are included in the segmentation.
bw = bw & bwmorph(roi,'erode');

%# Colonies are merged in the segmented image. Observing that colonies are 
%# quite bright, we can find a single point per colony by as the regional
%# maxima (the brightest points in the image) which occur in the segmentation.
colonies = imregionalmax(I) & bw;

%# Component labeling with 4-connectivity to avoid merging adjacent colonies.
bwcc = bwconncomp(colonies,4);
count = bwcc.NumObjects;

Мы используем этот код следующим образом:

I = imread('http://i.stack.imgur.com/TiLS3.jpg');
[count,colonies,mask] = colony_count(I);

Я также добавил функцию colony_count в обмен файлами. Если у вас есть изображение, которое не работает, но вы думаете, что нужно оставить комментарий.

Счет 359, что, я бы сказал, довольно близко. Вы можете проверить сегментацию (mask) и маркеры колоний (colonies), чтобы увидеть, где были сделаны ошибки:

%# Leave out the changes to mask to just see the colony markers.
%# Then you can see why we are getting some false colonies.
R = I; R(mask) = 255; R(colonies) = 0;
G = I; G(mask) = 0; G(colonies) = 255;
B = I; B(mask) = 0; B(colonies) = 0;
RGB = cat(3,R,G,B);
imshow(RGB);

Ответ 2

Вы можете использовать технику под названием связанной метки компонентов, которую можно использовать, чтобы различать разные объекты в изображении.

Прежде всего вам нужно сделать двоичный файл изображения некоторым средним значением порога. Маркировка выполняется путем сканирования каждой строки пикселя дважды, один раз слева направо и один раз справа налево. Мы ищем пиксели объектов, то есть пиксели, которые имеют значение 1.

В режиме сканирования слева направо: для каждого пикселя p: Если p является пикселем объекта, скопируйте ярлык сверху или влево. Если p является фоновым пикселем или p имеет ярлык, ничего не делайте.

Для сканирования справа налево: для каждого пикселя p: если p является пикселем объекта, скопируйте метку справа, если она есть, в противном случае установите новую метку. Если p является фоновым пикселем или p имеет ярлык, ничего не делайте. Если метка существует, а пиксель справа от p имеет другую метку, обратите внимание на это.

Например (из слайдов слайдов в http://webstaff.itn.liu.se/~bjogu/TNM087-2012/Fo7-2012-AH.pdf):

labeling example

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

Ответ 3

Что бы я сделал:

Добавлено:

Обнаружение кругов с различными радиусами в изображении в оттенках серого через Hough Transform