【问题标题】:Counting colonies on a Petri dish计数培养皿上的菌落
【发布时间】:2012-04-14 20:12:32
【问题描述】:

我有一堆满是点的培养皿,我想在 Matlab 中数一数。这是否可以可靠地分批完成?

例如这个板块有352个菌落

我已经尝试过 ImageJ,但需要在边框之外进行大量裁剪并获得可变结果。

你有什么建议吗?

【问题讨论】:

  • 自从我不得不做这样的事情或使用 Matlab 已经很久了 - 但你不必使用 edge detection 吗?那里肯定有很多预先编写的脚本。
  • 有这个工具:NICE 用于这项工作,但我无法打开它。它抱怨没有某个 dll 文件。
  • 尝试下载/安装.dll?检查您是否有正确版本的 Matlab 等。
  • @benedict_w 我是否必须为该应用程序提供特定的 Matlab 编译器运行时。它会覆盖我当前的安装吗?
  • 请计算示例图像中的菌落数作为“基本事实”。

标签: matlab image-processing grayscale threshold


【解决方案1】:

我对这个问题的处理方法如下:

  1. 使用 Hough 变换来识别与培养皿对应的圆圈。
  2. 使用 Otsu 方法的全局阈值,仅限于菜肴。
  3. 将菌落计数为原始图像的区域最大值,在分割图像中表示。

这个file exchange toolbox 为我们提供了一个有效的循环霍夫变换。从那里开始事情就很简单了:

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);

【讨论】:

  • @Li-aungYip 谢谢,但希望没有人把他们的盘子放在白色背景上......
  • @Li-aungYip 确实......但当然,这个例子在 HSV 空间中是微不足道的。
  • 这也是检查您自动处理的任何数据的随机样本的一个很好的理由。概括地说,一种方法可以完美地处理您开发的样本数据,但部分数据可能会违反您的假设。
  • 非常好的答案。只是评论一下,最新版本的 Image Processing Toolbox (12a) 具有内置的循环霍夫变换的新功能。
【解决方案2】:

您可以使用一种称为连接组件标记的技术,该技术可用于区分图像中的不同对象。

首先,您需要通过某种阈值处理方法使图像二值化。标记是通过两次扫描每个像素行来完成的,一次从左到右,一次从右到左。我们正在寻找对象像素,即值为 1 的像素。

在从左到右的扫描中: 对于每个像素 p:如果 p 是对象像素,则从上方或左侧复制标签。如果 p 是背景像素或 p 有标签,则什么也不做。

对于从右到左的扫描: 对于每个像素p:如果p是对象像素,如果有则从右边复制标签, 否则设置一个新标签。如果 p 是背景像素或 p 有标签,则什么也不做。如果一个 标签存在且p右边的像素有不同的标签,记下这一点。

例如(来自http://webstaff.itn.liu.se/~bjogu/TNM087-2012/Fo7-2012-AH.pdf 的讲座幻灯片):

当你扫描了整张图片后,合并你记下的所有标签(它们连接到同一个对象),然后计算不同标签的数量,你就会得到你的计数。

【讨论】:

  • 我了解您所描述的程序。我的图像增加了培养皿边框的难度,这很麻烦,特别是因为它与点的颜色相似......可以在不物理移除的情况下消除吗?
  • 很好解释的伙伴!!
【解决方案3】:

我会做的是:

  1. 将图像转换为binary image,可以使用 一些threshold on the Intensity。 注意点更轻所以你可以在之后做1-binaryImage 采取门槛。我不知道你为什么说它们是黑色的,但无论它们是什么颜色都是一样的。

  2. 之后,您可以使用 Hough transform 并绘制 histogramrho and theta

  3. 在该直方图上,您可能会在 rho 上设置第二个阈值 == 半径。

添加:

Detect circles with various radii in grayscale image via Hough Transform

【讨论】:

  • 为什么要使用霍夫变换?这里没有要检测的线。
  • @nikie 来自维基百科(链接在消息中)“在数字图像的自动分析中,经常会出现检测简单形状(例如直线、圆形或椭圆)的子问题”
  • 您是否使用了错误的链接?如果我在您的答案中点击霍夫变换链接,它会清楚地显示“使用霍夫函数检测图像中的线条”
  • @nikie 我添加了一个模块来使用霍夫变换检测圆圈。
猜你喜欢
  • 2017-07-29
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 2015-09-23
相关资源
最近更新 更多