7

我想分别检测图像的每一行(即一行)上的边缘,而不是对 2D 图像进行边缘检测。这是从输入一维向量中检测边缘,其值是从 0 到 255 的像素强度(下图): 在此处输入图像描述

我想检测示例输入中出现的主要边缘(下图) 在此处输入图像描述

4

3 回答 3

10

获得所需结果的一种方法是按如下方式调整 2D Canny 边缘检测器(Mathematica 中的代码):

首先,使用高斯导数滤波器计算空间导数,将 sigma 值设置为相对于要检测的边缘的比例。取结果的绝对值。

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

在此处输入图像描述

于 2012-02-13T20:50:07.720 回答
2

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

作为副产品,您将获得起点和终点(虽然并不完全是您期望的位置,但如果需要,可以对此进行改进)。

条码?

于 2012-02-13T21:20:12.327 回答
1

因此,您正在寻找斜率的特定变化 - 即每个样本的 Y 的特定变化?

它不是简单地查看两个样本之间的 Y 差异,以及它的绝对值是否改变了超过某个极限标记作为边缘?

于 2012-02-13T17:14:16.027 回答