Одномерное определение края - PullRequest
6 голосов
/ 13 февраля 2012

Вместо обнаружения края 2D-изображения, я хотел бы обнаруживать края в каждой отдельной строке (например, в строке) изображения.То есть обнаружение краев из входного 1D-вектора, значения которого являются интенсивностями пикселей в диапазоне от 0 до 255 (изображение ниже): enter image description here

Я хотел бы обнаружить основные края, которые появляются на входе образца (изображениениже) enter image description here

Ответы [ 3 ]

7 голосов
/ 14 февраля 2012

Один из способов получить желаемый результат - адаптировать 2D детектор контуров Canny следующим образом (код в Mathematica):

Сначала вычислите пространственную производную, используя фильтр гауссовой производной, установив относительное значение сигмыв масштабе краев, которые вы хотите обнаружить.Возьмите абсолютное значение результата.

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

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

2 голосов
/ 13 февраля 2012

Итак, вы ищете конкретное изменение наклона - то есть определенное изменение Y на выборку?

Разве это не просто посмотреть на разницу в Y между двумя выборками, и если его абсолютное значение изменилось более чем на какую-то предельную отметку, которая является ребром?

1 голос
/ 14 февраля 2012

Учитывая хороший контраст этих краев, есть простое решение, которое будет работать надежно: обнаруживать все монотонные последовательности значений пикселей (строго увеличивая или уменьшая).Вы будете сохранять последовательности, имеющие общую высоту выше порога (в вашем случае 50), чтобы отклонить шумные пики.

В качестве побочного продукта вы получите начальную и конечную точки (не совсем там, где вы ожидаете иххотя, но это может быть улучшено при необходимости).

Штрих-коды?

...