Я работаю в проекте, где полосы проецируются на объект, и делается фотография. Задача состоит в том, чтобы найти центральные линии полос, которые математически представляют трехмерную кривую пересечения между плоскостью полосы и поверхностью объекта.
Фотография представляет собой PNG (RGB), и в предыдущих попытках использовалась градация серого, а затем пороговое значение разницы, чтобы получить черно-белую «зебра-подобную» фотографию, из которой было легко найти среднюю точку каждого столбца пикселей каждой полосы. Проблема заключается в том, что, используя пороговое значение, а также принимая среднюю высоту столбца дискретных пикселей, мы получаем некоторую потерю точности и квантование, что вовсе не желательно.
Когда я смотрю на изображения, у меня складывается впечатление, что центральные линии могли бы быть более непрерывными (больше точек) и более плавными (не квантованными), если бы они были обнаружены непосредственно из изображения без порога (RGB или в градациях серого) некоторым статистическим методом развертки (некоторое затопление / итеративная свертка, что угодно).
Ниже приведен пример изображения:
Любое предложение будет высоко ценится!
источник
Ответы:
Я предлагаю следующие шаги:
x
найдите взвешенный центр (по интенсивности пикселей) вy
направлении.y
значения, чтобы удалить шум.(x,y)
точки, подгоняя какую-то кривую. Эта статья может вам помочь. Вы также можете использовать многочлен высокого уровня, хотя, на мой взгляд, он хуже.Вот код Matlab, который показывает шаги 1,2 и 4. Я пропустил автоматический выбор порога. Вместо этого я выбрал руководство
th=40
:Это кривые, которые определяются путем нахождения средневзвешенного значения по столбцу:
Это кривые после подгонки полинома:
Вот код:
источник
double
. О результатах в нижней половине, мне нужно проверить, это может быть программная ошибкаЯ бы не использовал изображение RGB. Цветные изображения обычно создаются с помощью «фильтра Байера» на сенсоре камеры, который обычно снижает разрешение, которое вы можете достичь.
Если вы используете изображение в градациях серого, я думаю, что описанные вами шаги (бинаризация изображения «зебра», поиск средней линии) являются хорошим началом. В качестве последнего шага я бы
источник
Вот еще альтернативное решение вашей проблемы, смоделировав ваш вопрос как «проблему оптимизации пути». Хотя это сложнее, чем простое решение для бинаризации и затем кривой, на практике оно более надежно.
С очень высокого уровня, мы должны рассматривать это изображение как график, где
каждый пиксель изображения является узлом на этом графике
каждый узел связан с некоторыми другими узлами, известными как соседи, и это определение соединения часто называют топологией этого графа.
каждый узел имеет вес (особенность, стоимость, энергия или как вы хотите его назвать), отражая вероятность того, что этот узел находится в оптимальной центральной линии, которую мы ищем.
До тех пор, пока мы можем смоделировать эту вероятность, ваша задача поиска «осевых линий границ» переходит к задаче поиска локальных оптимальных путей на графе , которые могут быть эффективно решены с помощью динамического программирования, например, алгоритма Витерби.
Вот некоторые плюсы принятия этого подхода:
все ваши результаты будут непрерывными (в отличие от порогового метода, который может разбить одну центральную линию на части)
много свобод для построения такого графа, вы можете выбрать различные функции и топологию графа.
Ваши результаты являются оптимальными в смысле оптимизации пути
Ваше решение будет более устойчивым к шуму, поскольку пока шум равномерно распределяется между всеми пикселями, эти оптимальные пути остаются стабильными.
Вот короткая демонстрация вышеуказанной идеи. Поскольку я не использую какие-либо предварительные знания для определения возможных начальных и конечных узлов, я просто декодирую по каждому возможному начальному узлу.
Для нечетких окончаний это вызвано тем, что мы ищем оптимальные пути для всех возможных конечных узлов. В результате, хотя для некоторых узлов, расположенных в темных областях, выделенный путь все еще остается локально оптимальным.
Для нечеткого пути вы можете сгладить его после того, как найдете его, или использовать некоторые сглаженные функции вместо необработанной интенсивности.
Можно восстановить частичные пути, изменив начальный и конечный узлы.
Нетрудно обрезать эти нежелательные локальные оптимальные пути. Потому что у нас есть вероятность всех путей после декодирования Витерби, и вы можете использовать различные предшествующие знания (например, мы видим, что нам нужен только один оптимальный путь для тех, кто использует один и тот же источник).
Для более подробной информации, вы можете обратиться к статье.
Вот небольшой фрагмент кода Python, который используется для создания приведенного выше графика.
источник
Думаю, я должен опубликовать свой ответ, так как он немного отличается от других подходов. Я попробовал это в Matlab.
Один недостаток, который я вижу здесь, состоит в том, что этот подход не будет работать хорошо для некоторых ориентаций полос. В этом случае мы должны исправить его ориентацию и применить эту процедуру.
Вот код Matlab:
Например, если вы возьмете средний столбец изображения, его профиль должен выглядеть следующим образом: (синим цветом обозначен профиль. Зеленым цветом обозначены локальные максимумы).
И изображение, содержащее локальные максимумы для всех столбцов, выглядит так:
Вот подключенные компоненты (хотя некоторые полосы нарушены, большинство из них получают непрерывную область):
источник