Подсчет колоний на чашке Петри - PullRequest
10 голосов
/ 31 марта 2012

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

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

enter image description here

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

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

Ответы [ 3 ]

14 голосов
/ 31 марта 2012

Мой подход к этой проблеме следующий:

  1. Используйте преобразование Хафа для определения кругов, соответствующих чашке Петри.
  2. Глобальное определение порога по методу Оцу, ограниченное блюдом.
  3. Подсчет колоний как региональных максимумов исходного изображения, представленных на сегментированном изображении.

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

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's 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 голосов
/ 31 марта 2012

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

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

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

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

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

labeling example

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

1 голос
/ 31 марта 2012

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

  1. Преобразуйте изображение в двоичное изображение , что можно сделать с помощью некоторого порога для интенсивности .обратите внимание, что точки светлее, поэтому вы можете сделать 1-binaryImage после принятия порога.Я не знаю, почему вы сказали, что они черные, но это одна и та же идея, независимо от того, какого они цвета.

  2. , после этого вы можете использовать Преобразование Хафа и нарисуйте гистограмму из rho and theta

  3. , и на этой гистограмме вы можете взять второй порог по радиусу rho ==.

Добавлено:

Обнаружение кругов с различными радиусами на изображении в оттенках серого с помощью преобразования Хафа

...