我有一堆装满小圆点的培养皿,想在Matlab中进行数数。这可以可靠地批量完成吗?
例如,这个培养皿有352个菌落。
我尝试过ImageJ,但需要剪裁掉边框并且结果不稳定。您有什么建议吗?
我有一堆装满小圆点的培养皿,想在Matlab中进行数数。这可以可靠地批量完成吗?
例如,这个培养皿有352个菌落。
我尝试过ImageJ,但需要剪裁掉边框并且结果不稳定。您有什么建议吗?
我解决这个问题的方法如下:
这个文件交换工具箱为我们提供了一个可用的环形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);