Как интерполировать между точками данных?
в настоящее время я разрабатываю программное обеспечение с использованием opencv и qt, которое строит точки данных. Мне нужно иметь возможность заполнить изображение из неполных данных. Я хочу интерполировать между точками, которые у меня есть. Может ли кто-нибудь порекомендовать библиотеку или функцию, которые могли бы мне помочь. Я думал, может быть, метод OpenCV reMap, но я не могу заставить это работать.
данные представляют собой 2-d матрицу значений интенсивности. Я хочу создать какой-то образ. Это школьный проект.
4 ответов
Фух! Большая тема.
"правильный" ответ зависит большое о вашем проблемном домене и различных деталях того, что вы делаете.
интерполяция в более чем 1 измерении требует принятия некоторых решений. Я предположу, что вы строите график на регулярной сетке, но некоторые из ваших точек сетки не имеют данных. Большой вопрос: Являются ли недостающие точки разреженными или они делают большие капли?
вы не могу добавить информацию, так что вы просто пытаясь установить что-то, что будет посмотреть OK.
концептуально простое предложение (но реализация может быть некоторые работы):
для каждой области отсутствующих данных определите все точки ребра. То есть Найти x в этой фигуре
oooxxooo
oox..xoo
oox...xo
ox..xxoo
oox.xooo
oooxoooo
где .s-недостающие данные точек, а x и o имеют данные (для одной недостающей точки это будут четыре ближайших соседа). Заполните каждую недостающую точку данных средним значением over край указывает вокруг этого пятна. Чтобы сделать его гладким, вес каждой точки на 1/d
где d-расстояние taxidriver (Дельта x + Дельта y) между двумя точками..
от прежде чем мы имели любые детали:
в отсутствие такого рода информации, вы пробовали прямо вперед линейную интерполяцию? Если ваши данные достаточно плотные, это может сделать это за вас, и достаточно просто кодировать в строке, когда вам это нужно.
следующий шаг обычно это кубический сплайн, но для этого вы, вероятно, захотите захватить существующую реализацию.
когда мне нужно что-то более мощное, чем быстрая линейная интерполяция, я обычно использую ROOT (и выберите один из классов TSpline), но это может быть больше накладных расходов, чем вам нужно.
как отмечено в комментариях, ROOT - это большой, и пока он быстр, он пытается заставить вас делать вещи корневым способом, поэтому он может оказать большое влияние на ваш программа.
линейная интерполяция между (Или действительно экстраполяция из) двух точек (x1, y1) и (x2, y2) дает вам
y_i = (x_i-x1)*(y2-y1)/(x2-x1)
интерполяция является сложным предметом. Существует бесконечно много способов интерполировать множество точек, и это предполагает, что вы действительно хотите сделать интерполяцию, а не сглаживание любого рода. (Интерполятор точно воспроизводит исходные точки данных.) И, конечно, 2-d характер этой проблемы делает вещи более трудными.
существует несколько распространенных схем интерполяции рассеянных данных в 2-d. На самом деле, для тех, кто имеет доступ к нему, очень хорошая бумага доступно (Richard Franke," интерполяция рассеянных данных: тесты некоторых методов", Mathematics of Computation, 1982.)
возможно, наиболее распространенный метод основан на триангуляции ваших данных. Просто построить триангуляцию домена из ваших точек данных. Тогда любая точка внутри выпуклой оболочки данных должна находиться точно внутри одного из треугольников, иначе она будет находиться на общем краю. Это позволяет интерполировать линейно внутри треугольника. Если вы используете MATLAB, то для этой цели доступна функция griddata.)
проблема при попытке заполнить полное прямоугольное изображение из рассеянных точек заключается в том, что очень вероятно, что данные не распространяются на 4 угла массива. В этом случае схема на основе триангуляции потерпит неудачу, так как углы массива не лежат внутри выпуклой оболочки рассеянных точек. Альтернативой тогда является использование "радиальных базисных функций" (часто сокращенно RBF). Там много таких схем быть найдены, в том числе Кригинга, при использовании геостатистического сообщества.
http://en.wikipedia.org/wiki/Kriging
наконец, inpainting-это имя схемы интерполяции, где элементы заданы в массиве, но где отсутствуют элементы. Имя очевидно ссылается на то сделанное консерватором искусства которому нужно отремонтировать разрыв или сорвать в ценной части произведение искусства.
http://en.wikipedia.org/wiki/Inpainting
идея inpainting обычно заключается в формулировании краевой задачи. То есть определить дифференциальное уравнение в частных производных на области, где есть отверстие. Используя известные граничные значения, заполните отверстие, решив PDE для неизвестных элементов. Это может быть вычислительно интенсивным, если существует огромное количество неизвестных элементов, так как обычно требуется решение по крайней мере массивная разреженная система линейных уравнений. Если PDE является нелинейным, то это становится еще более интенсивной проблемой. Простой, разумно хороший выбор для PDE-лапласиан, что приводит к линейной системе, которая хорошо экстраполируется. Опять же, я могу предложить решение для пользователя MATLAB.
http://www.mathworks.com/matlabcentral/fileexchange/4551
лучшие варианты для PDE могут исходить из нелинейных PDE. Как только это уравнение Навье/Стокса. Он хорошо подходит для моделирования типов поверхностей, которые обычно видны, но с ним также сложнее иметь дело. Как и во многих других сферах жизни, вы получаете то, за что платите.
учитывая, что это простой школьный проект, вероятно, самый простой метод интерполяции для реализации - "ближайшие соседи"
для каждой недостающей точки данных вы находите ближайшую "заполненную" точку данных и используете ее в качестве значения.
Если вы хотите улучшить ретульты немного больше, то вы можете, скажем, найти k ближайших точек данных и использовать их средневзвешенное значение в качестве значения вашей недостающей точки данных.
вес может быть пропорциональным к расстоянию точки от недостающей точки данных.
существует множество других методов, но ближайший сосед, вероятно, самый простой в реализации.
Если я понимаю, что ваша потребность в следующем.
Я думаю, что у вас есть подмножество X,y, интенсивности для измерения L на W, и вы хотите заполнить для всех X в диапазоне от 0 до L и Y в диапазоне от 0 до W.
Если это ваш вопрос, то решение состоит в том, чтобы получить другие интенсивности с помощью фильтров.
Я думаю, что Bayer filter или Gaussian filter сделают эту работу за вас.
вы можете google эти фильтры, и вы получите ответы на осуществлять.
удачи.