Распознавание искажений в регулярной сетке - PullRequest
18 голосов
/ 07 февраля 2011

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

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

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

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

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

     Regular:                               Distorted: 

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

Ответы [ 2 ]

19 голосов
/ 07 февраля 2011

Я думаю, вы ищете алгоритм Digital Image Correlation .

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

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

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

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

Редактировать

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

enter image description here

Редактировать

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

enter image description here

Редактировать

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

enter image description here

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

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

1 голос
/ 07 февраля 2011

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

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

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

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

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

...