一维边缘检测

时间:2012-02-13 17:11:11

标签: image image-processing 2d computer-vision edge-detection

我想要分别检测图像的每一行(即一条线)上的边缘,而不是二维图像的边缘检测。即从输入1D向量检测边缘,其值为0到255的像素强度(下图): enter image description here

我想检测样本输入中出现的主要边缘(下图) enter image description here

3 个答案:

答案 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]}]

enter image description here

可选 - 似乎这就是你想要的 - 只保留边缘的最低端。在这种情况下,对边缘末端的数据点进行聚类是有效的,但我不确定它有多强大。

t = FindThreshold@data[[steps]];
steps2 = Select[steps, data[[#]] <= t &];

ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}]

enter image description here

答案 1 :(得分:2)

所以你正在寻找斜率的特定变化 - 即每个样本的Y有一定的变化吗?

是不是只看两个样本之间Y的差异,是否它的绝对值变化超过了作为边缘的某个极限标记?

答案 2 :(得分:1)

鉴于这些边缘的良好对比度,有一个简单的解决方案可以稳健地工作:检测所有单调的像素值序列(严格增加或减少)。您将保持序列的总高度高于阈值(在您的情况下为50)以拒绝嘈杂的峰值。

作为副产品,您将获得起点和终点(虽然不是您期望的那样,但如果需要,可以对其进行改进)。

条形码?