本周文件交换选择

我们最好的用户反馈

检测图像中的圆圈

一位客户最近给我提供了一张细胞的图像,这些细胞大致呈圆形,但不是很清晰,而且经常重叠。他问我们如何使用MATLAB和图像处理工具箱在有噪声的情况下分割细胞。我们中的许多人都知道图像处理工具箱中的霍夫变换功能,以及该功能检测图像中的线条的能力。经过一些修改,霍夫变换也可以用来寻找其他形状。在这种情况下,我想找到圆;快速搜索“检测圆”在MATLAB中央文件交换显示陶鹏的实现圆形霍夫变换.在简单下载之后,我就开始着手解决这个问题了。陶的档案是布雷特选择的本周精选。(感谢Biopticon公司的Cem Girit允许使用他的图片!)

内容

读取、显示图像

togglefig原始注意:togglefig是我为管理图形而编写的实用函数% windows,并且可用% Img = imread(“NB1ln1.jpg”);imshow (img);

你会如何细分这个市场?

分割通常是一项非常具有挑战性的任务,特别是对像这张这样有噪声的图像。例如,可以尝试简单的阈值或边缘检测例程,或者更复杂的分水岭方法。不幸的是,这些方法都没有为这张特定的图像提供我想要的结果。我有点不知所措——直到我找到了CircularHough_Grd。Tao在他非常有用的评论中提出了一些过滤操作。在这个演示中,我将看看算法如何通过一些非常小的预处理来执行。

丢弃颜色信息

Tao的函数直接作用于灰度图像。我没有使用图像处理工具箱的RGB2GRAY函数将彩色图像转换为灰度,而是选择简单地使用第一个(红色)颜色平面,并使用自适应直方图均衡化:
togglefig (《调整后的红色飞机》)红= img(:,:,2);红色= adapthisteq(红色);imshow(红色)

分割参数

在分割之前,我需要知道图像中的细胞有多大;CircularHough_Grd以要搜索的半径范围作为输入。使用图像处理工具箱的IMTOOL中的IMDISTLINE函数,我估计感兴趣的半径范围约为5到25个像素。例如,您可以修改其他输入参数,以修改函数对不太完美的圆的敏感性,或者更改它处理同心圆的方式。这使得程序非常灵活!

现在是分割…

抽搐;[accum, circen, cirrad] =...CircularHough_Grd(红色,[5 25],...20,13,1);toc
运行时间为4.169272秒。

...还有一点后期处理

Tao注意:偶尔,你的算法会返回0半径的“hits”:
Any (cirrad <= 0)
Ans = 1
这很容易解决(例如,防止下面的RECTANGLE命令出错),但这可能是一个增强的机会。
如果任何(cirrad <= 0) inds = find(cirrad>0);Cirrad = Cirrad (inds);Circen = Circen (inds,:);结束

查看结果

现在让我们看看算法的表现如何:
togglefig结果imshow (img);持有;情节(circen (: 1) circen (:, 2),' r + ');Ii = 1:大小(圆周,1)矩形(“位置”,[circen(ii,1) - cirrad(ii), circen(ii,2) - cirrad(ii), 2*cirrad(ii), 2*cirrad(ii)],...“弯曲”[1],“edgecolor”“b”“线宽”, 1.5);结束持有
这很了不起,尤其是考虑到我的预处理很简单。(自适应直方图均衡化有很大帮助;Tao建议的过滤器进一步提高了性能。)

最后的评论

运行此算法所需的时间因用户设置而异。在这种情况下,我的计算机大约花了4秒钟——但在分割图像方面做得非常出色。注意它是如何处理重叠的单元格(圆圈)的,例如:
togglefig崩溃Imshow (img) xlims = [406 520];Ylims = [52 143];集(gca),“xlim”xlims,“ylim”,ylims) inImageCircles = find(inpolygon(circen(:,1), circen(:,2), xlims([1 2 2 1]), ylims([1 1 2 2])));ii = 1:数字(inImageCircles)矩形(“位置”...[circen(inImageCircles(ii),1) - cirrad(inImageCircles(ii)),...circen(inImageCircles(ii),2) - cirrad(inImageCircles(ii)),...2 * cirrad (inImageCircles (ii)),...2 * cirrad (inImageCircles (ii))),...“弯曲”[1],“edgecolor”“b”“线宽”, 1.5);结束
如果您做过图像处理,您可能会意识到Tao的函数是如何使一个非常具有挑战性的问题变得非常容易处理的。如果你不是图像处理专家,这对你来说可能有点神秘……但希望你能从中找到一些价值。我很想听听你的意见!

使用MATLAB®7.6发布

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。