分割树叶中的静脉的最佳方法?


47

我已经做了许多研究,并发现了诸如自适应阈值法,分水岭等方法,可以用于检测叶片的脉络。但是阈值化不好,因为它会引入很多噪声

我所有的图像都是灰色图像,在迫切需要帮助的同时考虑到这个问题时,任何人都可以建议采取什么方法

编辑:我的原始图片

在此处输入图片说明

阈值化之后

在此处输入图片说明

如答案所示,我已经尝试了以下边缘检测

  1. 坎尼

太多的噪音和不必要的干扰

在此处输入图片说明

  1. 索贝尔

在此处输入图片说明

  1. 罗伯茨

在此处输入图片说明

编辑:尝试了一次以上的操作,我得到的结果比我尝试过的精巧和适应性更好的以下结果您感觉如何?

在此处输入图片说明


您能给我们看看一些图片吗?
乔纳斯(Jonas)2012年

我添加了图片
vini 2012年

@vini您当前是否正在将其作为预处理步骤,以便稍后获得良好的模板匹配?另外,如何通过简单的阈值获得第二张图像?
Spacey 2012年

我的目标是在分割静脉时获得最佳结果,以使我的输出不包含杂散伪像。我使用自适应阈值获取第二张图像
vini 2012年

从给定的图像看来,您正在对阈值图像使用(各种)滤镜。这将给极其糟糕的结果。您应该在原始图像上使用滤镜,然后将其阈值设置为阈值。
约翰

Answers:


56

您不是在寻找边缘(=介于高灰度值和低灰度值的扩展区域之间的边界),而是在寻找线(细线比其邻域更暗或更亮),因此边缘滤镜可能不是理想的选择:边缘滤镜给你两个侧面(在线条的每一侧),在线条的中间有一个低响应:

过滤样品

添加:如果要求您更清楚地说明边缘检测器和脊检测器之间的区别。如果这个答案太长了,我提前致歉。

边缘检测器通常是一阶导数运算符:如果您将输入图像想象为3D风景,则边缘检测器会测量该风景的每个点处的坡度的陡度:

在此处输入图片说明

如果要检测扩展的明亮或黑暗区域的边界,这很好。但是对于OP图像中的静脉,它会给您相同的效果:每个静脉的左右轮廓:

在此处输入图片说明

这也解释了Canny边缘检测器结果中的“双线模式”:

在此处输入图片说明

那么,您如何检测这些细线(即山脊)呢?这个想法是,像素值可以(局部)由二阶多项式近似,即,如果图像函数为,则对于和较小值:x ygxy

g(x,y)12x22gx2+xy2gxy+12y22gy2+xgx+ygy+g(0,0)

或者,以矩阵形式:

g(x,y)12(xy).(2gx22gxy2gxy2gy2).(xy)+(xy).(gxgy)+g(0,0)

二阶导数矩阵被称为“ “ Hessian矩阵”。它描述了我们感兴趣的二阶结构。(2gx22gxy2gxy2gy2)

通过将上面的Hessian矩阵分解为一个旋转乘以其特征值的对角矩阵,该函数的二阶部分可以转换为两个抛物线的总和。(矩阵分解)。我们不在乎旋转(我们想检测任何方向的山脊),因此我们只对和感兴趣λ1x2+λ2y2λ1λ2

该函数近似可以具有哪种形状?实际上,没有那么多:

在此处输入图片说明

为了检测山脊,我们想在图像中找到看起来像上面最后一个图的区域,因此我们正在寻找粗麻布的主要特征值较大(与次要特征值相比)的区域。最简单的检测方法是计算每个像素的主要特征值-这就是下面的脊线过滤器所做的。


脊形过滤器可能会给出更好的结果。我已经尝试了Mathematica的内置图像RidgeFilter(可在每个像素上计算黑森矩阵的主要特征值):

脊形过滤器

如您所见,每个细黑线只有一个峰。对收益进行二值化和骨架化:

在此处输入图片说明

修剪骨架并从图像中删除小组件(噪声)后,我得到了最后一个骨架:

在此处输入图片说明

完整的Mathematica代码:

ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]

加:

我不是Matlab专家,我不知道它是否具有内置的脊线滤波器,但是我可以向您展示如何“手动”实现它(再次使用Matematica)。就像我说的那样,脊形滤波器是黑森州矩阵的主要特征值。我可以在Mathematica中以符号方式计算该特征值:

eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]

=>12(Hxx+Hyy+Hxx2+4Hxy22HxxHyy+Hyy2)

因此,您要做的是计算二阶导数,,(使用高斯滤波器的sobel或导数)并将其插入到上面的表达式中,就得到了脊过滤器。 H xy H yyHxxHxyHyy


是的,这正是我想要的,但是我正在Matlab中做,要找到等效的山脊滤波器已变得很困难
vini 2012年

1
@nikie很好的答案-问题-您能为我们的非图像处理人员详细说明边缘检测器和脊检测器之间的区别吗?再次感谢
Spacey 2012年

@Mohammad:我已经尽力了,我希望我现在把它
弄清楚了

我尝试过脊形过滤器无法获得令人满意的结果
年份

2
@vini:“没有给出令人满意的结果”并不能告诉我很多。您得到的图像与我发布的图像相同吗?什么是“不满意”?
Niki Estner 2012年

6

当使用Canny边缘检测(在Halcon中)时,alpha为1,低阈值8和高阈值13(在1-255的范围内),我得到以下结果:

坎尼边缘检测叶

通过调整参数,可以大大改善您从Canny获得的结果。使用此图像,您可以跳过短边以消除噪点,并连接长边以获得最终结果。

顺便说一句:不同的颜色表示不同的边缘。

使用此在线Canny边缘检测器,我可以获得类似的结果:

  • 选择图片I9Pxl.png
  • 适马1.2
  • 最低的0.04
  • 最高T 0.07
  • 其他设置默认
  • 点击更新查看结果

谢谢:)我猜坎尼就是最好的;)顺便说一下,在你的结果将康力可能会产生更好的效果..
Geerten

顺便说一句:如果您没有注意到:Canny边缘检测器的局限性是什么?您可以在这里发表您的看法!
Dipan Mehta 2012年

如果您告诉我:我已经对您的问题发表了看法。如果您总体上发表评论:我将删除此评论。
盖尔滕2012年

哦,是的-我没意识到!
Dipan Mehta 2012年

感谢您的回答,但是canny不能保留您所显示的未检测到的叶脉的精细细节……
vini 2012年

6

继上面的出色答案之后,这里是如何使用scikit funcitons在python中进行操作。

from skimage.feature import hessian_matrix, hessian_matrix_eigvals

#assume you have an image img

hxx, hxy, hyy = hessian_matrix(img, sigma=3)
i1, i2 = hessian_matrix_eigvals(hxx, hxy, hyy)

#i2 is the variable you want.

#Visualise the result
import matplotlib.pyplot as plt
plt.imshow(i2)

什么img应该是什么?我有一个png文件,它不起作用。
Sigur

img应该是2d numpy数组。
马修·顺信

实际上,i1是较大的特征值,因此应使用该特征值。
罗布

这是我见过的最清晰的解释!
尤里卡

3

代替阈值化,我应用了简单的边缘检测。

使用的GIMP具有高斯差异-半径外部:3.0和内部:1.0。

这就是它的样子。

在此处输入图片说明

您可以进一步应用中值滤波器或腐蚀/膨胀,以便消除一些颗粒状的噪声。

这是解释gimp实施的页面

您应该参考不同的技术,例如高斯的拉普拉斯算子或高斯的差分等。请参见:http ://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7

这个答案如何用拉普拉斯算作“锐化蒙版”?


GIMP?是哪个边缘检测器?
维尼

1
否-这是图片编辑包。这是一项快速检查-仅提出要点-使用边缘检测而不是阈值检测。
Dipan Mehta 2012年

GIMP使用什么边缘检测器?很抱歉,我对此知之甚少
vini

@vini添加了参考。
Dipan Mehta 2012年

3

这个话题一直吸引着很多兴趣,但是在这个话题上还没有真正的共识。因此,我决定放弃几句话。

我对以前在stackexchange(Q1Q2)上类似问题的回答是Steger提出的亚像素曲线结构提取算法。幸运的是,这种方法在很多情况下都表现良好,包括这种情况。因此,我将输出图像发布到此处: 在此处输入图片说明 并在此处使用不同的参数设置,并且不带有连接色: 在此处输入图片说明 有关详细信息和正确的参考,请参阅我所引用的stackexchange帖子。


0

作为我去年工程研究任务的一部分,我不得不研究眼底图像中血管的分割方法。我发现这种树重构方法(由Cohen,Laurent D.和Mille,Julien撰写)与快速前进方法一起使用特别有趣。

您可能需要研究的其他论文:

  • 测地线活动轮廓
  • 关于3D格快速行进方法的实现
  • 多模板FMM:笛卡尔域上Eikonal方程的高精度解决方案

有用的链接:-2D和3D中的正面传播

我希望这会有所帮助,尽管这不是最先进的技术。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.