Matlab 在皮氏培养皿上计数菌落
我有一堆装满点的培养皿,我想在Matlab中数一数。这能可靠地批量完成吗 这个盘子有352个菌落 我尝试过ImageJ,但需要进行大量的边界裁剪,以获得可变的结果 你有什么建议吗?我想做的是:Matlab 在皮氏培养皿上计数菌落,matlab,image-processing,grayscale,threshold,Matlab,Image Processing,Grayscale,Threshold,我有一堆装满点的培养皿,我想在Matlab中数一数。这能可靠地批量完成吗 这个盘子有352个菌落 我尝试过ImageJ,但需要进行大量的边界裁剪,以获得可变的结果 你有什么建议吗?我想做的是: 将图像转换为可以使用 一些 请注意,这些点较亮,因此您可以在之后执行1-binaryImage 进入门槛。我不知道你为什么说它们是黑色的,但不管它们是什么颜色,都是一样的 之后,您可以使用并绘制 ρ和θ的 在这个柱状图上,你可以在ρ上取第二个阈值 ==半径 添加: 您可以使用一种称为“连接组件标签”的技
1-binaryImage
进入门槛。我不知道你为什么说它们是黑色的,但不管它们是什么颜色,都是一样的您可以使用一种称为“连接组件标签”的技术来区分图像中的不同对象 首先,您需要通过某种阈值方法使图像二值化。标签是通过扫描每个像素行两次来完成的,一次从左到右,一次从右到左。我们正在寻找对象像素,即值为1的像素 在从左到右的扫描中: 对于每个像素p:如果p是对象像素,则从上方或左侧复制标签。如果p是背景像素或p有标签,则不执行任何操作 对于从右向左扫描: 对于每个像素p:如果p是对象像素,则从右侧复制标签(如果有), 否则设置一个新标签。如果p是背景像素或p有标签,则不执行任何操作。如果 标签存在并且p右侧的像素具有不同的标签,请记下这一点 例如(来自于的讲座幻灯片):
扫描完整个图像后,合并所有已标记的标签(它们连接到同一对象),然后计算不同标签的数量,然后进行计数。我解决此问题的方法如下:
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;
我还上传了colony\u count
功能。如果你有一个图像不起作用,但你认为应该,在那里留下评论
计数是359,我想这很接近。您可以检查分段(遮罩
)和菌落标记(菌落
)以查看哪里出错:
%# 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);
我已经很久没有做过这样的事情了,也没有用过Matlab,但是你不需要用吗?那里一定有很多预先编写的脚本。有这个工具:用于工作,但我无法打开它。它抱怨没有特定的dll文件。是否尝试下载/安装.dll?请检查是否有正确版本的Matlab,等等@benedict_w我必须为该应用程序提供特定的Matlab编译器运行时。它会覆盖我当前的安装吗?请将示例图像中的菌落数计算为“地面真相”。为什么要使用Hough变换?这里没有要检测的线条。@wikipedia的nikie(链接在消息中)“在数字图像的自动分析中,经常会出现检测简单形状(如直线、圆或椭圆)的子问题”您使用了错误的链接吗?如果我按照你答案中的Hough变换链接,它清楚地说“使用Hough函数检测图像中的线条”@nikie我还添加了一个使用Hough变换检测圆的模块。我理解你描述的过程。我的图像增加了Petri培养皿边界的难度,这是一个麻烦,特别是因为它的颜色与点相似。。。这能在不进行物理移除的情况下消除吗?解释得很好,伙计@李昂杰谢谢,但希望没有人把他们的车牌放在白色背景上…@Li aungYip确实如此…但在HSV空间中,这个例子当然是微不足道的。这也是检查自动处理的任何数据的随机样本的一个很好的理由。作为一种概括,一种方法将完美地应用于您开发它所用的样本数据,但部分数据可能会违反您的假设。非常好的答案。最近发布的图像处理工具箱(12a)内置了一个用于循环Hough变换的新功能。
%# 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);