2009-03-04 2 views
9

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

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

+0

Дополнительная информация: Какие данные? Можете ли вы рассказать о природе кривых (например, как они выглядят?) – Rook

+0

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

+0

Так что в основном не ответы ниже отвечали на вопрос о том, чтобы предлагать библиотеку или функцию .... потому что у меня такая же проблема, как и у. – bakalolo

ответ

7

Фу! Большая тема.

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

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

Вы не может добавить информацию, так что вы просто пытаетесь создать что-то, что будет выглядеть OK.

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

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

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

где. 'S являются точками недостающих данных, и х годов и о имеют данные (для одного недостающего точки, это будет четыре ближайших соседей). Заполните каждую пропущенную точку данных средним значением по краям точки вокруг этого блоба. Для того, чтобы сделать ее гладкой, вес каждой точке 1/d, где d представляет собой Таксист расстояние (дельта х + дельта у) между двумя точками ..


От прежде чем мы имели какие-либо детали:

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

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


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

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


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

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

Корень - НЕОСТОЙНОЕ количество накладных расходов. И не нужно ли большинство из них запускаться через интерпретатор, а не компилироваться? –

+0

Много накладных расходов: да. Необходимо использовать cint: no (я предпочитаю компилировать вещи против него). И я физик частиц, поэтому я уже установил его и хорошо знаю ... – dmckee

+0

Ваш ответ в значительной степени соответствует тому, что я ищу, но я бы предпочел не реализовывать его сам, есть ли библиотека C++, которая я мог бы использовать, чтобы получить такой результат? – Sam

0

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

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

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

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

Вы можете воспользоваться этими фильтрами, и вы получите ответы на них.

Удачи.

12

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

Существует несколько общих схем интерполяции рассеянных данных в 2-й. Фактически для тех, у кого есть доступ к нему, доступна очень хорошая бумага (Ричард Франк, «Интерполяция рассеянных данных: тесты некоторых методов», Математика вычислений, 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 может исходить от нелинейных уравнений в частных производных. Как только это уравнение Навье-Стокса. Он хорошо подходит для моделирования типов поверхностей, которые обычно видны, но с ними также труднее справиться. Как и во многих аспектах жизни, вы получаете то, за что платите.

1

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

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

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

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

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