与其检测2D图像的边缘,我想要单独检测图像每一行(即一条线)的边缘。这是从输入的1D向量中检测边缘,该向量的值是介于0到255之间的像素强度(如下图所示):
我想要检测主要的边缘,就像样本输入中显示的那样(如下图所示):
与其检测2D图像的边缘,我想要单独检测图像每一行(即一条线)的边缘。这是从输入的1D向量中检测边缘,该向量的值是介于0到255之间的像素强度(如下图所示):
我想要检测主要的边缘,就像样本输入中显示的那样(如下图所示):
通过以下方法之一,可以实现所需结果:将2D Canny边缘检测器进行调整(使用Mathematica的代码):
首先,使用高斯导数滤波器计算空间导数,将sigma值相对于要检测的边缘的比例进行设置。取结果的绝对值。
d = Abs@GaussianFilter[data, {{10, 5}}, 1];
thrd = FindThreshold[d];
然后,检测导数值的步骤(进入/离开“死区”)。
steps = Flatten@Image`StepDetect[d, thrd]["NonzeroPositions"];
此时您已经有了边缘的端点:
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}]
可选的——似乎这是您想要的——仅保留边缘的最低端。在这种情况下,将数据点聚类到边缘的末端是可行的,但我不确定它有多健壮。
t = FindThreshold@data[[steps]];
steps2 = Select[steps, data[[#]] <= t &];
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}]
所以你正在寻找特定的斜率变化 - 即每个样本中Y值的某种变化?
难道不是简单地查看两个样本之间的Y值差异,如果其绝对值发生了超过某个限制的变化,则将其标记为边缘吗?