Простой случай оптического потока

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

Исследование, которое я уже сделал: Я начал читать Оптимальное оценивание оптического потока с высокой точностью на основе теории деформирования, и я планирую просмотреть документ Particle Video. Я нашел оптический поток MATLAB High Optical Optical Flow. Тем не менее, документы (и код), похоже, описывают концепции, которые очень вовлечены и могут потребовать много времени для того, чтобы я мог понять и понять. Я надеюсь, что решение моей проблемы может быть более простым.

Проблема: У меня есть последовательность изображений. На изображениях изображен процесс разрушения материала, где материал и фон черные, а трещины - белые. Мне интересно перемещаться по последовательности изображений в обратном направлении, пытаясь сопоставить все трещины, образовавшиеся в процессе обрыва, с первым черным изображением. Вы можете думать о материале как о большой загадке, и я пытаюсь собрать фигуры в обратном порядке, чтобы они сломались.

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

Желаемый результат:. Все трещины/строки в последовательности отображаются на первое изображение в последовательности.

Дополнительные примечания: Изображения доступны в полутоновом формате (то есть в оригинале), а также в двоичном формате, где трещины были выделены белым цветом, а фон полностью черный. Ниже приведены примеры изображений.

orig_img1orig_img2orig_img3

binary_img1binary_img2binary_img3

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

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

Язык:. Хотя это и не обязательно, я хотел бы реализовать решение с помощью MATLAB (только потому, что большая часть другого кода, относящегося к проекту, была выполнена в MATLAB). Однако, если OpenCV может быть проще, я гибко использую язык/библиотеку.

Любые идеи приветствуются.

Ответ 1

Перемещение вперед, а не наоборот, и не используйте оптический поток. Используйте линии перелома для сегментирования черных деталей, отслеживайте центроид каждого черного сегмента с течением времени. Всякий раз, когда появляется новая линия перелома, которая пересекает черный сегмент, разделите сегмент на два и продолжайте отслеживать каждый сегмент отдельно.

Из этого вы должны иметь возможность построить древовидную структуру, представляющую сегментирование черных частей с течением времени. Линии разрушения могут быть добавлены как метаданные к этому дереву, возможно, назначая линии разлома для сегмента node, в котором они впервые появились.

Ответ 2

Я бы посоветовал вам следовать вашей первоначальной идее отбросить трещины. Вы знаете, как выглядят трещины, поэтому вы можете отслеживать все точки, принадлежащие трещине. Вы просто отслеживаете все белые точки с помощью оптического контроллера потока, начинайте с трекера Lukas-Kanade и смотрите, где вы находитесь. Метод высокоточного оптического потока является глобальным и более общим, я буду отслеживать все пиксели изображения, пытаясь сохранить гладкость везде. LK - это локальный метод, который будет использовать небольшое окно вокруг каждой точки для отслеживания. Проблема в том, что appart из трещин все пиксели простые черные, поэтому ничего не отслеживать там, вы просто будете таскать время, пытаясь отследить то, что вы не можете отслеживать, и вам не нужно отслеживать. Если линии очень прямые, вы можете получить то, что называется проблема диафрагмы, и вы получите неточные результаты. Вы также можете попробовать некоторые фитинги/деформации на основе змей.

Ответ 3

Я согласен с Damian. Большинство методов оптического потока, таких как HAOF, основаны на приближении Тейлора первого порядка константы константы constrian уравнения я (x, t) = я (x + v, t + dt). Это означает, что решение зависит от производных изображения, где градиент определяет величину и угол вектора движения, т.е. Вам нужно определенное количество текстуры. Однако очень малой текстуры ваших неинвазированных изображений могут быть достаточно. Вы могли бы попытаться уравнивать гистограмму, чтобы увеличить контрастность ваших входных данных, но важно применить одно и то же преобразование для обоих входных изображений. например следующим образом:

cv::Mat equalizeMat(grayInp1.rows, grayInp1.cols * 2 , CV_8UC1);
grayInp1.copyTo(equalizeMat(cv::Rect(0,0,grayInp1.cols,grayInp1.rows))); 
grayInp2.copyTo(equalizeMat(cv::Rect(grayInp1.cols,0,grayInp2.cols,grayInp2.rows)));
cv::equalizeHist(equalizeMat,equalizeMat);
equalizeMat(cv::Rect(0,0,grayInp1.cols,grayInp1.rows)).copyTo(grayInp1);
equalizeMat(cv::Rect(grayInp1.cols,0,grayInp2.cols,grayInp2.rows)).copyTo(grayInp2);
// estimate optical flow