2012-03-31 2 views
10

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

E.g. Эта пластина имеет 352 колоний

enter image description here

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

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

+0

Это возраст, так как я должен был сделать что-то подобное или использовать Matlab - но вы не должны использовать [ (http://initora.wordpress.com/article/learn-matlab-image-processing-edge-232y3pcqwxodx-29/])? Там должно быть много предварительно написанных сценариев. –

+0

Этот инструмент: [NICE] (http://www.nist.gov/pml/div682/grp01/nice.cfm) для работы, но я не могу его открыть. Он жалуется, что не имеет определенного файла dll. – HCAI

+0

попробуйте и загрузите .dll? Убедитесь, что у вас есть правильная версия Matlab для него и т. Д. –

ответ

14

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

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

Этот file exchange toolbox предоставляет нам рабочий циркуляр Hough transform. Вещи довольно просто оттуда:

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 функцию on the file exchange. Если у вас есть изображение, которое не работает, но вы думаете, что нужно оставить комментарий.

Счет 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); 
+0

+1 фантастический ответ. –

+0

@ Li-aungYip Спасибо, но, надеюсь, никто не ставит свою тарелку на белом фоне ... –

+0

[Какая такая присоска сделает это?] (Http://farm4.static.flickr.com/3008/2367953025_b5760be025_o.jpg) –

1

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

  1. Преобразование изображения в binary image, которое может быть сделано с помощью некоторых threshold on the Intensity. Обратите внимание, что точки светлее, поэтому вы можете сделать 1-binaryImage после принимая порог. Я не знаю, почему вы сказали, что они черные, но это та же идея, независимо от того, какого цвета они находятся.

  2. после этого вы можете использовать Hough transform и сюжет histogram из rho and theta

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

Добавлено:

Detect circles with various radii in grayscale image via Hough Transform

+0

Зачем вам использовать преобразование Хафа? Здесь нет линий. – Niki

+0

@nikie от wikipedia (ссылка находится в сообщении) «В автоматическом анализе цифровых изображений часто возникает подзадача обнаружения простых фигур, таких как прямые линии, круги или эллипсы» – 0x90

+0

Вы использовали неправильную ссылку? Если я следую ссылке «Преобразование Хафа» в вашем ответе, в ней четко сказано «Использовать функцию hough для обнаружения линий на изображении» – Niki

2

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

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

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

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

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

labeling example

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

+0

Я понимаю описанную вами процедуру. У моих изображений есть дополнительная сложность границы чашки Петри, которая является неприятностью, особенно потому, что она имеет тот же цвет, что и точки ... Может ли это быть устранено без физического удаления? – HCAI

+0

хорошо объясненный помощник !! –