Подсчет колоний на чашке Петри
У меня есть куча чашек Петри, полных точек, которые я хотел бы подсчитать в Matlab. Можно ли это сделать надежно и партиями?
например. Эта пластина имеет 352 колонии
Я пробовал ImageJ, но нужно сделать совсем немного обрезки из границы и получить переменные результаты.
У вас есть какие-либо предложения?
3 ответов
мой подход к этой проблеме следующим образом:
- используйте преобразование Хоу, чтобы определить круги, соответствующие чашке Петри.
- глобальный обмолот с методом Оцу, ограниченным блюдом.
- подсчитайте колонии как региональные максимумы исходного изображения, которые представлены в сегментированном изображении.
этой file exchange toolbox обеспечивает нас с работая круговым преобразованием 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'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);
вы можете использовать метод, называемый маркировкой подключенных компонентов, который может использоваться для различения различных объектов в изображении.
прежде всего, вам нужно сделать двоичное изображение с помощью некоторого средства порога. Маркировка выполняется путем сканирования каждой строки пикселей дважды, один раз слева направо и один раз справа налево. Мы ищем пиксели объекта, т. е. пиксели, которые имеют значение 1.
при сканировании слева направо: для каждого пикселя p: если p это пиксель объекта, скопируйте метку сверху или слева. Если p является фоновым пикселем или p имеет ярлык, ничего не делает.
для сканирования справа налево: для каждого пикселя p: если p является пикселем объекта, скопируйте метку справа, если она есть, в противном случае установите новую метку. Если p является фоновым пикселем или p имеет ярлык, ничего не делает. Если метка существует и пиксель справа от p имеет другую метку, обратите внимание на это.
например (из лекционных слайдов на http://webstaff.itn.liu.se / ~bjogu/TNM087-2012 / Fo7-2012-AH.pdf):
когда вы отсканировали все изображение, объедините все метки, которые вы отметили (они подключены к тому же объекту), а затем подсчитайте количество различных меток, и у вас будет свой счет.
что бы я сделал, так это:
преобразуйте изображение в бинарное изображение что можно сделать с помощью некоторые порог по интенсивности. обратите внимание, что точки легче, так что вы могли бы сделать
1-binaryImage
после переступаю порог. Я не знаю, почему вы сказали, что они черные, но это одна и та же идея, независимо от того, какого цвета они.после этого вы можете использовать преобразование Хафа и сюжет гистограмма из
rho and theta
и на этой гистограмме вы можете взять второй порог на rho == радиус.
добавлено: