一维边缘检测

C g*_*ics 6 2d image image-processing computer-vision edge-detection

我想要分别检测图像的每一行(ig一行)上的边缘而不是2D图像的边缘检测.即从输入1D向量检测边缘,其值为0到255的像素强度(下图): 在此输入图像描述

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

Mat*_*sio 8

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

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

d = Abs@GaussianFilter[data, {{10, 5}}, 1];
Run Code Online (Sandbox Code Playgroud)

然后,自动确定阈值以将先前的导数值聚类在两组中(这里使用Otsu的方法).

thrd = FindThreshold[d];
Run Code Online (Sandbox Code Playgroud)

然后,检测导数值的步骤(进入/离开"死区").

steps = Flatten@Image`StepDetect[d, thrd]["NonzeroPositions"];
Run Code Online (Sandbox Code Playgroud)

此时你有边缘的末端:

ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述