用MATLAB进行图像处理

图像处理概念、算法和MATLAB

分水岭转变问题从技术支持金宝app

这周金宝app有个客户打来了一个支持电话分水岭分割图像:

投诉就是那个电话分水岭没有产生良好的细分。

今天我想展示如何使用分水岭分割图像。在此过程中,我将解释分水岭变换分水岭分割

首先,我们先打个电话分水岭看看会发生什么。

url =“https://blogs.mathworks.com/images/steve/2013/blobs.png”;bw = imread (url);L =分水岭(bw);Lrgb = label2rgb (L);imshow (Lrgb)

当我看到这个结果时,我一开始很困惑。然后我意识到发生了什么。让我用imfuse为了同时显示这两张图片,放大一个特定的斑点。

imshow(imfuse(bw,Lrgb))轴([10 175 15 155])

你看,分水岭变换总是为图像中的每个局部最小值(或区域最小值)提供一个分水岭区域。这些小的黑色“噪声点”是局部最小值,所以在它们周围有一个分水岭区域。

即使我们填补了这些漏洞,仅仅使用分水岭转换本身也永远不会产生客户所寻求的细分。这就引出了分水岭分割和分水岭变换之间的区别。分水岭分割指的是一组算法基于在分水岭上变换。除了非常具体的情况,分水岭变换本身并不是一种完整的分割方法。

几年前,我写了一篇MathWorks的通讯文章分水岭变换:图像分割策略.为了复习基础知识,这是值得回顾的。这篇文章的中心概念是:

使用分水岭变换进行分割的关键是:将您的图像转换为另一个图像,其中的集水区是您想要识别的对象。

对于像这样的图像,大致是由圆形的,触摸的斑点组成。距离变换对于生成“集水区是您想要识别的对象”的图像非常有用。

在进行距离变换之前,让我们先清理一下噪声。这个函数bwareaopen可以用来去除非常小的斑点。它在前景中删除了它们,所以我们在调用前后对图像进行了补充bwareaopen

Bw2 = ~bwareaopen(~bw, 10);imshow (bw2)
D = -bwdist (~ bw);imshow (D, [])

现在我们开始有所进展了。然后,计算的分水岭变换D

Ld =分水岭(D);imshow (label2rgb (Ld))

分水岭脊线,用白色表示,对应于Ld = = 0.让我们使用这些脊线来分割二值图像,将相应的像素改变为背景。

bw2 = bw;bw2(Ld == 0) = 0;imshow (bw2)

“原始”分水岭变换因其倾向于“过度分割”图像而闻名。原因是我上面提到的:每个局部最小值,无论多么小,都会变成一个集水区。在基于分水岭的分割方法中,一个常见的技巧是使用imextendedmin然后修改距离变换,使过滤掉的位置不出现最小值。这被称为“最小强加”,并通过函数实现imimposemin

下面是对imextendedmin理想情况下应该只是在待分割细胞的中间产生小点。我将使用imshowpair将掩模叠加到原始图像上。

掩码= imextendedmin (D, 2);imshowpair (bw,面具,“混合”

冲刺阶段,现在。修改距离变换,使它只在所需的位置有最小值,然后重复上面的分水岭步骤。

D2 = imimposemin (D,面具);Ld2 =分水岭(D2);bw3 = bw;bw3(Ld2 == 0) = 0;imshow (bw3)

就是这样!看我的通讯的文章介绍了利用分水岭变换进行图像分割的其他思想。




发布与MATLAB®R2013b

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。