我想要分别检测图像的每一行(即一条线)上的边缘,而不是二维图像的边缘检测。即从输入1D向量检测边缘,其值为0到255的像素强度(下图):
我想检测样本输入中出现的主要边缘(下图)
答案 0 :(得分:7)
获得所需结果的一种方法是如下调整2D Canny边缘检测器(Mathematica中的代码):
首先,使用高斯导数滤波器计算空间导数,相对于要检测的边的比例设置西格玛值。取结果的绝对值。
d = Abs@GaussianFilter[data, {{10, 5}}, 1];
然后,自动确定一个阈值,将两个组中的先前导数值聚类(这里使用Otsu的方法)。
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]}]
答案 1 :(得分:2)
所以你正在寻找斜率的特定变化 - 即每个样本的Y有一定的变化吗?
是不是只看两个样本之间Y的差异,是否它的绝对值变化超过了作为边缘的某个极限标记?
答案 2 :(得分:1)
鉴于这些边缘的良好对比度,有一个简单的解决方案可以稳健地工作:检测所有单调的像素值序列(严格增加或减少)。您将保持序列的总高度高于阈值(在您的情况下为50)以拒绝嘈杂的峰值。
作为副产品,您将获得起点和终点(虽然不是您期望的那样,但如果需要,可以对其进行改进)。
条形码?