Вопрос

В настоящее время я разрабатываю программное обеспечение, использующее opencv и qt, которое отображает точки данных.Мне нужно иметь возможность заполнить изображение из неполных данных.Я хочу интерполировать между имеющимися у меня точками.Может ли кто-нибудь порекомендовать библиотеку или функцию, которая могла бы мне помочь.Я подумал, может быть, метод opencv reMap, но, похоже, не могу заставить его работать.

Данные представляют собой двумерную матрицу значений интенсивности.Я хочу создать какой-то образ.Это школьный проект.

Это было полезно?

Решение

Уф!Большой предмет.

«Правильный» ответ зависит много о вашей проблемной области и различных деталях того, что вы делаете.

Интерполяция более чем в одном измерении требует принятия некоторых решений.Я предполагаю, что вы строите график на регулярной сетке, но некоторые из точек вашей сетки не содержат данных.Большой вопрос:недостающих точек мало или они образуют большие капли?

Ты не мочь добавить информацию, то есть вы просто пытаетесь установить что-то, что будет смотреть ХОРОШО.

Концептуально простое предложение (но реализация может потребовать некоторой работы):

Для каждого региона по отсутствующим данным определите все краевые точки.Вот и найди х на этом рисунке.

oooxxooo
oox..xoo 
oox...xo
ox..xxoo
oox.xooo
oooxoooo

где . — это точки, в которых отсутствуют данные, а символы x и o содержат данные (для одной отсутствующей точки это будут четыре ближайших соседа).Заполните каждую недостающую точку данных средним значением по граничным точкам вокруг этого объекта.Чтобы сделать его гладким, взвесьте каждую точку на 1/d где d — расстояние таксиста (дельта x + дельта y) между двумя точками.


До того, как у нас появились какие-либо подробности:

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

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


Когда мне нужно что-то более мощное, чем быстрая линейная интерполяция, я обычно использую КОРЕНЬ (и выберите один из классов TSpline), но это может потребовать больше накладных расходов, чем вам нужно.

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


Линейная интерполяция между (или даже экстраполяция) двумя точками (x1, y1) и (x2, y2) дает вам

 y_i = (x_i-x1)*(y2-y1)/(x2-x1)

Другие советы

Интерполяция – сложная тема.Существует бесконечно много способов интерполяции набора точек, и это при условии, что вы действительно хотите выполнить интерполяцию, а не какое-либо сглаживание.(Интерполянт точно воспроизводит исходные точки данных.) И, конечно же, двумерный характер этой проблемы усложняет ситуацию.

Существует несколько распространенных схем интерполяции разбросанных данных в 2-d формате.На самом деле, для тех, у кого есть к ней доступ, доступна очень хорошая статья (Ричард Франке, «Интерполяция разбросанных данных:Тесты некоторых методов», Математика вычислений, 1982.)

Возможно, наиболее распространенный метод основан на триангуляции данных.Просто постройте триангуляцию домена на основе ваших точек данных.Тогда любая точка внутри выпуклой оболочки данных должна лежать внутри ровно одного из треугольников, иначе она окажется на общем ребре.Это позволяет выполнять линейную интерполяцию внутри треугольника.Если вы используете MATLAB, то для этой конкретной цели доступна функция Griddata.)

Проблема при попытке заполнить полное прямоугольное изображение из разбросанных точек заключается в том, что, скорее всего, данные не распространяются на 4 угла массива.В этом случае схема, основанная на триангуляции, потерпит неудачу, поскольку углы массива не лежат внутри выпуклой оболочки разбросанных точек.Альтернативой является использование «радиальных базисных функций» (часто сокращенно RBF).Существует множество таких схем, включая кригинг, которые используются геостатистическим сообществом.

http://en.wikipedia.org/wiki/Кригинг

Наконец, inpainting — это название схемы интерполяции, в которой элементы задаются в массиве, но есть недостающие элементы.Название, очевидно, относится к операции, выполняемой реставратором произведений искусства, которому необходимо отремонтировать потертость или потертость ценного произведения искусства.

http://en.wikipedia.org/wiki/Inpainting

Идея рисования обычно заключается в формулировке краевой задачи.То есть определите уравнение в частных производных в области, где есть дыра.Используя известные граничные значения, заполните дыру, решив УЧП для неизвестных элементов.Это может потребовать больших вычислительных ресурсов, если имеется огромное количество неизвестных элементов, поскольку обычно требуется решение как минимум массивной разреженной системы линейных уравнений.Если УЧП является нелинейным, то это становится еще более серьезной проблемой.Простым и достаточно хорошим выбором для УЧП является лапласиан, который дает в результате линейную систему, которая хорошо экстраполируется.Опять же, я могу предложить решение для пользователя MATLAB.

http://www.mathworks.com/matlabcentral/fileexchange/4551

Лучшим выбором для УЧП могут быть нелинейные УЧП.Одним из таких является уравнение Навье/Стокса.Он хорошо подходит для моделирования типов поверхностей, которые обычно встречаются, но с ним сложнее иметь дело.Как и во многих аспектах жизни, вы получаете то, за что платите.

Учитывая, что это простой школьный проект, вероятно, самый простой метод интерполяции — это «Ближайшие соседи».

Для каждой отсутствующей точки данных вы находите ближайшую «заполненную» точку данных и используете ее в качестве значения.

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

вес может быть пропорционален расстоянию точки от отсутствующей точки данных.

Существует множество других методов, но «ближайший сосед», вероятно, проще всего реализовать.

если я понимаю, что ваша потребность заключается в следующем.

Я думаю, что у вас есть подмножество x, y, Intensity для измерения L на W, и вы хотите заполнить все X в диапазоне от 0 до L и Y в диапазоне от 0 до W.

Если это ваш вопрос, то решение состоит в том, чтобы получить другую интенсивность с помощью фильтров.

Я думаю, что фильтр Байера или фильтр Гаусса подойдут вам.

Вы можете погуглить эти фильтры и получите ответы для реализации.

Удачи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top