Подтвердить что ты не робот

Признание искажений в регулярной сетке

Чтобы дать вам некоторое представление о том, что я делаю: я пытаюсь количественно записать изменения в потоке сжимаемой жидкости через анализ изображения. Один из способов сделать это - использовать тот факт, что показатель преломления жидкости напрямую связан с ее плотностью. Если вы настроили какое-то изображение за потоком, искажение изображения из-за изменения показателя преломления во всем поле жидкости приведет вас к градиенту плотности, что помогает охарактеризовать картину потока.

У меня есть набор подпрограмм, которые делают это успешно с регулярным двумерным шаблоном точек. Точечная диаграмма слегка искажена, и, сравнивая положение точек в искаженном изображении с изображением на не искаженном изображении, я получаю поле смещения, которое именно то, что мне нужно. Проблема с этим методом - разрешение. Разрешение ограничено количеством точек в поле, и я изучаю методы, которые дают мне больше данных.

Одна из моих идей - использовать регулярную сетку горизонтальных и вертикальных линий. Это изображение будет искажать то же самое, но вместо того, чтобы получать только смещение точки, у меня будет непрерывное искажение сетки. Похоже, что должен быть какой-то стандартный алгоритм или процедура для сравнения одной геометрической сетки с другой и вывести какое-то поле смещения. Тем не менее, я не нашел ничего подобного в своих исследованиях.

Есть ли у кого-нибудь идеи, которые могли бы указать мне в правильном направлении? FYI, я не компьютерный ученый - я инженер. Я говорю, что только потому, что может быть какой-то очевидный подход, я пренебрегаю из-за перехода из другого поля. Но я могу программировать. Я использую MATLAB, но я могу читать Python, C/С++ и т.д.

Ниже приведены примеры типов изображений, с которыми я работаю:

     Regular:                               Distorted: 

enter image description here -------- enter image description here

4b9b3361

Ответ 1

Я думаю, вы ищете алгоритм Цифровая корреляция изображения.

Здесь вы можете увидеть демонстрацию.

Вот реализация Matlab.

Из Википедии:

Корреляция и отслеживание цифровых изображений (DIC/DDIT) - это оптический метод, который использует методы отслеживания и регистрации изображений для точных 2D и 3D измерений изменений изображений. Это часто используется для измерения деформации (инженерного), смещения и деформации, но широко применяется во многих областях науки и техники.

Изменить

Здесь я применил алгоритм DIC к вашему искаженному изображению, используя Mathematica, показывая относительные перемещения.

enter image description here

Изменить

Вы также можете легко определить зону максимального перемещения:

enter image description here

Изменить

После некоторой работы (довольно откровенно) вы можете подойти к чему-то подобному, представляя "поле смещения", четко показывая, что вы имеете дело с вихрем:

enter image description here

(Более темные и большие стрелки означают большее смещение (скорость))

Отправьте мне комментарий, если вас интересует код Mathematica для этого. Я думаю, что мой код не поможет никому другому, поэтому я пропустил его размещение.

Ответ 2

Я бы также предложил, чтобы алгоритм отслеживания строк работал хорошо.

Просто начните с первой линии изображения и начните следовать за каждой вертикальной строкой вниз (вам просто нужно запустить это в первой строке, чтобы получить начальные точки. Это можно сделать с помощью простого шаблона, который перемещается ортогонально к градиенту этой линии, эрго следует за линией. Когда вы достигаете пересечения горизонтальной линии, вы можете измерить эту точку (в координатах x, y) и сравнить ее с соответствующей точкой пересечения в вашем искаженном изображении.

Поскольку ваша сетка правильная, вы знаете, что n-я измеренная точка пересечения на m'th вертикальной черной линии соответствует на обоих изображениях. Затем вы просто сравниваете обе точки, вычисляя их расстояние. Сделайте это для каждой линии на вашей сетке, и вы получите, насколько искажена каждая точка пересечения сетки.

Это, следуя линейному алгоритму, также используется в базовых алгоритмах связывания Edge или в детекторе Canny Edge.

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