我已经做了许多研究,并发现了诸如自适应阈值法,分水岭等方法,可以用于检测叶片的脉络。但是阈值化不好,因为它会引入很多噪声
我所有的图像都是灰色图像,在迫切需要帮助的同时考虑到这个问题时,任何人都可以建议采取什么方法
编辑:我的原始图片
阈值化之后
如答案所示,我已经尝试了以下边缘检测
- 坎尼
太多的噪音和不必要的干扰
- 索贝尔
- 罗伯茨
编辑:尝试了一次以上的操作,我得到的结果比我尝试过的精巧和适应性更好的以下结果您感觉如何?
我已经做了许多研究,并发现了诸如自适应阈值法,分水岭等方法,可以用于检测叶片的脉络。但是阈值化不好,因为它会引入很多噪声
我所有的图像都是灰色图像,在迫切需要帮助的同时考虑到这个问题时,任何人都可以建议采取什么方法
编辑:我的原始图片
阈值化之后
如答案所示,我已经尝试了以下边缘检测
太多的噪音和不必要的干扰
编辑:尝试了一次以上的操作,我得到的结果比我尝试过的精巧和适应性更好的以下结果您感觉如何?
Answers:
您不是在寻找边缘(=介于高灰度值和低灰度值的扩展区域之间的边界),而是在寻找脊线(细线比其邻域更暗或更亮),因此边缘滤镜可能不是理想的选择:边缘滤镜给你两个侧面(在线条的每一侧),在线条的中间有一个低响应:
添加:如果要求您更清楚地说明边缘检测器和脊检测器之间的区别。如果这个答案太长了,我提前致歉。
边缘检测器通常是一阶导数运算符:如果您将输入图像想象为3D风景,则边缘检测器会测量该风景的每个点处的坡度的陡度:
如果要检测扩展的明亮或黑暗区域的边界,这很好。但是对于OP图像中的静脉,它会给您相同的效果:每个静脉的左右轮廓:
这也解释了Canny边缘检测器结果中的“双线模式”:
那么,您如何检测这些细线(即山脊)呢?这个想法是,像素值可以(局部)由二阶多项式近似,即,如果图像函数为,则对于和较小值:x y
或者,以矩阵形式:
二阶导数矩阵被称为“ “ Hessian矩阵”。它描述了我们感兴趣的二阶结构。
通过将上面的Hessian矩阵分解为一个旋转乘以其特征值的对角矩阵,该函数的二阶部分可以转换为两个抛物线的总和。(矩阵分解)。我们不在乎旋转(我们想检测任何方向的山脊),因此我们只对和感兴趣
该函数近似可以具有哪种形状?实际上,没有那么多:
为了检测山脊,我们想在图像中找到看起来像上面最后一个图的区域,因此我们正在寻找粗麻布的主要特征值较大(与次要特征值相比)的区域。最简单的检测方法是计算每个像素的主要特征值-这就是下面的脊线过滤器所做的。
一脊形过滤器可能会给出更好的结果。我已经尝试了Mathematica的内置图像RidgeFilter
(可在每个像素上计算黑森矩阵的主要特征值):
如您所见,每个细黑线只有一个峰。对收益进行二值化和骨架化:
修剪骨架并从图像中删除小组件(噪声)后,我得到了最后一个骨架:
完整的Mathematica代码:
ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]
加:
我不是Matlab专家,我不知道它是否具有内置的脊线滤波器,但是我可以向您展示如何“手动”实现它(再次使用Matematica)。就像我说的那样,脊形滤波器是黑森州矩阵的主要特征值。我可以在Mathematica中以符号方式计算该特征值:
=>
因此,您要做的是计算二阶导数,,(使用高斯滤波器的sobel或导数)并将其插入到上面的表达式中,就得到了脊过滤器。 H xy H yy
当使用Canny边缘检测(在Halcon中)时,alpha为1,低阈值8和高阈值13(在1-255的范围内),我得到以下结果:
通过调整参数,可以大大改善您从Canny获得的结果。使用此图像,您可以跳过短边以消除噪点,并连接长边以获得最终结果。
顺便说一句:不同的颜色表示不同的边缘。
使用此在线Canny边缘检测器,我可以获得类似的结果:
继上面的出色答案之后,这里是如何使用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
文件,它不起作用。
i1
是较大的特征值,因此应使用该特征值。
代替阈值化,我应用了简单的边缘检测。
使用的GIMP具有高斯差异-半径外部:3.0和内部:1.0。
这就是它的样子。
您可以进一步应用中值滤波器或腐蚀/膨胀,以便消除一些颗粒状的噪声。
这是解释gimp实施的页面。
您应该参考不同的技术,例如高斯的拉普拉斯算子或高斯的差分等。请参见:http ://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7
这个答案如何用拉普拉斯算作“锐化蒙版”?
作为我去年工程研究任务的一部分,我不得不研究眼底图像中血管的分割方法。我发现这种树重构方法(由Cohen,Laurent D.和Mille,Julien撰写)与快速前进方法一起使用特别有趣。
您可能需要研究的其他论文:
有用的链接:-2D和3D中的正面传播
我希望这会有所帮助,尽管这不是最先进的技术。