我所有的图像都是灰色图像,请在有人急需帮助的同时考虑到这个问题时,有人可以建议采用什么方法
编辑:我的原始图像
阈值化后
如答案所示,我有尝试了以下边缘检测方法
Canny
噪声太大和有害干扰
< Sobel
Roberts
编辑:我尝试了另一种操作得到以下结果比我尝试过canny和adaptive的效果要好。
#1 楼
您不是在寻找边缘(=高和低灰度值的扩展区域之间的边界),而是在寻找脊(细线比其邻域更暗或更亮),因此边缘滤镜可能不是理想的选择:边缘滤镜给你两个侧面(线条的两侧),并且在线条中间响应低:ADD:如果被要求解释边缘检测器和脊检测器之间的差异更加明显。如果这个答案变得很长,我事先表示歉意。
(通常)边缘检测器是一阶导数运算符:如果您将输入图像想象为3D风景,则边缘检测器将测量该景观每个点的坡度:
如果要检测扩展的明暗区域的边界,这很好。但是对于OP图像中的静脉,它会给您相同的效果:每个静脉的左右轮廓:
这也解释了“双线模式”在Canny边缘检测器中的结果:
那么,如何检测这些细线(即脊)呢?这个想法是,像素值可以(局部)由二阶多项式近似,即,如果图像函数为$ g $,则对于$ x $和$ y $的较小值:
$ g(x,y)\约\ frac {1} {2} x ^ 2 \ frac {\ partial ^ 2g} {\ partial x ^ 2} + xy \ frac {\ partial ^ 2g} {\ partial x \ ,\ partial y} + \ frac {1} {2} y ^ 2 \ frac {\ partial ^ 2g} {\ partial y \,^ 2} + x \ frac {\ partial g} {\ partial x} + y \ frac {\ partial g} {\ partial y} + g(0,0)$
,或以矩阵形式:
$ g(x,y)\大约\ frac {1} {2} \ left(
\ begin {array} {c}
x&y
\ end {array}
\ right)。\ left (
\ begin {array} {cc}
\ frac {\ partial ^ 2g} {\ partial x ^ 2}&\ frac {\ partial ^ 2g} {\ partial x \,\ partial y } \\
\ frac {\ partial ^ 2g} {\ partial x \,\ partial y}&\ frac {\ partial ^ 2g} {\ partial y \,^ 2}
\ end {数组}
\ right)。\ left(
\ begin {array} {cc}
x \\
y
\ end {array}
\ right)+ \ left(
\ begin {array} { cc}
\ frac {\ partial g} {\ partial x}和\ frac {\ partial g} {\ partial y}
\ end {array}
\ right)。\ left (
\ begin {array} {c}
x \\
y
\ end {array}
\ right)+ g(0,0)$
二阶导数矩阵$ \ left(
\ begin {array} {cc}
\ frac {\ partial ^ 2g} {\ partial x ^ 2}&\ frac {\ partial ^ 2g} {\ partial x \,\ partial y} \\
\ frac {\ partial ^ 2g} {\ partial x \,\ partial y}&\ frac {\ partial ^ 2g} { \ partial y \,^ 2}
\ end {array}
\ right)$被称为“ Hessian矩阵”。它描述了我们感兴趣的二阶结构。
该函数的二阶部分可以转换为两个抛物线的和$ \ lambda _1 x ^ 2 + \ lambda _2 y ^ 2通过将上面的Hessian矩阵分解为一个旋转乘以其本征值的对角矩阵,矩阵$旋转了某个角度(矩阵分解)。我们不在乎旋转(我们想检测任何方向的山脊),因此我们只对$ \ lambda _1 $和$ \ lambda _2 $
感兴趣这个函数近似有吗?实际上,数量不多:
要检测山脊,我们想在图像中查找看起来像上面的最后一个图的区域,因此我们正在寻找适用于黑森州主要特征值较大(与次要特征值相比)的区域。最简单的检测方法是计算每个像素的主要特征值,这就是下面的脊形滤波器所做的。
脊形滤波器可能会提供更好的结果。我已经尝试过在图像上使用Mathematica内置的
RidgeFilter
(用于计算每个像素的黑森州矩阵的主要特征值):每个细黑线都有一个峰。二值化和骨架化收益率:修剪完骨架并从图像中删除了小的组件(噪声)后,我得到了最后一个骨架:
完整的Mathematica代码:
ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]
ADD:
我不是Matlab专家,我不知道它是否具有内置的ridge滤波器,但我可以向您展示如何实现它“手动”(再次使用Matematica)。就像我说的那样,脊形滤波器是黑森州矩阵的主要特征值。我可以在Mathematica中以符号形式计算该特征值:
$ \ text {eigenvalue} = \ text {Last} \ left [\ text {Eigenvalues} \ left [\ left(
\ begin {数组} {cc}
H _ {\ text {xx}}和H _ {\ text {xy}} \\
H _ {\ text {xy}}&H _ {\ text {yy}}
\ end {array}
\ right)\ right] \ right] $
=> $ \ frac {1} {2} \ left(H _ {\ text {xx }} + H _ {\ text {yy}} + \ sqrt {H _ {\ text {xx}} ^ 2 + 4 H _ {\ text {xy}} ^ 2-2 H _ {\ text {xx}} H _ {\ text {yy}} + H _ {\ text {yy}} ^ 2} \ right)$
因此,您要做的就是计算二阶导数$ H _ {\ text {xx}} $ ,$ H _ {\ text {xy}} $,$ H _ {\ text {yy}} $(使用高斯滤波器的sobel或导数)并将它们插入上面的表达式中,您便获得了脊形滤波器。 br />
评论
$ \ begingroup $
是的,这正是我想要的,但是我正在Matlab中做,要找到等效的脊形滤波器变得很困难
$ \ endgroup $
– Vini
2012年3月16日在1:50
$ \ begingroup $
@nikie很好的答案-问题-您能为非图像处理人员详细说明边缘检测器和脊检测器之间的区别吗?再次感谢
$ \ endgroup $
–太空
2012年3月17日,0:05
$ \ begingroup $
@Mohammad:我已经尽力了,我希望我现在把它弄清楚了,尽管数学
$ \ endgroup $
– Niki Estner
2012年3月17日12:46
$ \ begingroup $
我尝试过脊形滤光片无法获得令人满意的结果
$ \ endgroup $
– Vini
2012年3月18日17:26
$ \ begingroup $
@vini:“没有给出令人满意的结果”并不能告诉我很多。您得到的图像与我发布的图像相同吗?什么是“不满意”?
$ \ endgroup $
– Niki Estner
2012年3月19日上午11:32
#2 楼
继上面的出色答案之后,这是如何使用scikit funcitons在python中执行此操作。评论
$ \ begingroup $
应该是什么img?我有一个png文件,它不起作用。
$ \ endgroup $
– Sigur
16-10-17在23:54
$ \ begingroup $
img应该是2d numpy数组。
$ \ endgroup $
–马修顺信
16年11月14日在1:58
$ \ begingroup $
实际上,i1是特征值中较大的一个,因此您应该使用该特征值。
$ \ endgroup $
–Rob
17-2-27在14:29
$ \ begingroup $
这是我所见过的最清晰的解释!
$ \ endgroup $
–尤里卡
19年5月3日,9:16
#3 楼
当使用Canny边缘检测(在Halcon中)时,alpha为1,低阈值8和高阈值13(在1-255的范围内),我得到以下结果:通过调整参数,可以大大改善从Canny获得的结果。
使用此图像,您可以跳过短边以消除噪声,并连接长边以获得最终结果。
顺便说一句:不同的颜色表示不同的边缘。
使用此在线Canny边缘检测器,我可以获得类似的结果:
选择图片I9Pxl.png
Sigma 1.2
T -low 0.04
T-high 0.07
其他设置为默认
单击更新视图以获取结果
评论
$ \ begingroup $
谢谢:)我想Canny才是最好的;)顺便说一句,在您的结果上应用Canny可能会产生更好的结果。
$ \ endgroup $
– Geerten
2012年3月15日10:49
$ \ begingroup $
BTW:如果您没有注意到:Canny边缘检测器的局限性是什么?您可以在这里发表您的看法!
$ \ endgroup $
– Dipan Mehta
2012年3月15日12:18
$ \ begingroup $
如果您要告诉我:我已经对您的问题发表了看法。
$ \ endgroup $
– Geerten
2012年3月15日12:24
$ \ begingroup $
哦,是的-我没有意识到这一点!
$ \ endgroup $
– Dipan Mehta
2012年3月15日在12:28
$ \ begingroup $
感谢您的回答,但是canny不能保留您所显示的未检测到的叶脉的精细细节...
$ \ endgroup $
– Vini
2012年3月15日16:18
#4 楼
代替阈值化,我应用了简单的边缘检测。使用了具有高斯差异的GIMP-半径外部:3.0和内部:1.0。
这里是它的样子。
您可以进一步应用中值滤波器或腐蚀/膨胀,以便消除一些颗粒状噪声。
这是解释gimp实施的页面。
您应该参考不同的技术,例如高斯的拉普拉斯算子或高斯的差分等。请参见:http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7
这个答案怎么用拉普拉斯算作“锐化蒙版”?
评论
$ \ begingroup $
GIMP?是哪个边缘检测器?
$ \ endgroup $
– Vini
2012年3月14日17:51
$ \ begingroup $
否-这是图片编辑包。这是一项快速检查-仅提出要点-使用边缘检测而不是阈值检测。
$ \ endgroup $
– Dipan Mehta
2012-03-14 17:54
$ \ begingroup $
GIMP使用什么边缘检测器?对不起,我对此知之甚少
$ \ endgroup $
– Vini
2012年3月14日18:04
$ \ begingroup $
@vini添加了参考。
$ \ endgroup $
– Dipan Mehta
2012-03-14 18:26
#5 楼
这个话题一直吸引着很多兴趣,但是在这个话题上还没有真正的共识。因此,我决定放弃几句话。我对先前在stackexchange(Q1和Q2)上问过的类似问题的回答涉及Steger提出的亚像素曲线结构提取算法。幸运的是,这种方法在很多情况下都表现良好,包括这种情况。因此,我将输出图像发布在这里:
,这里使用不同的参数设置,并且没有连接色:
有关详细信息和正确的参考,请参见我提到的stackexchange帖子。
#6 楼
作为我去年工程研究任务的一部分,我不得不研究眼底图像中血管的分割方法。我发现这种树的重建方法(由Cohen,Laurent D.和Mille,Julien共同使用特别有趣)以及快速前进方法。
您可能还需要研究的其他论文:
大地测量主动轮廓线
关于快速前进方法的实现用于3D晶格
多模板FMM:笛卡尔域上Eikonal方程的高精度解决方案
有用的链接:
-2D和3D中的正面传播
>
我希望这会有所帮助,尽管这不是最先进的技术。
评论
您能给我们看一些图片吗?我已添加图片
@vini您当前是否正在将其作为预处理步骤,以便稍后获得良好的模板匹配?另外,如何通过简单的阈值获得第二张图像?
我的目标是在分割静脉时获得最佳结果,以使我的输出不包含杂散伪像。我使用自适应阈值获取第二张图像
从给定的图像看来,您正在对阈值图像使用(各种)滤镜。这将导致极差的结果。您应该在原始图像上使用滤镜,然后对它们的输出进行阈值设置。