データポイント間を補間する方法は?
-
03-07-2019 - |
質問
現在、opencvとqtを使用してデータポイントをプロットするソフトウェアを開発しています。不完全なデータから画像を埋めることができる必要があります。私が持っているポイント間を補間したい。誰でも私を助けることができるライブラリまたは機能を推奨できますか。多分opencv reMapメソッドを考えましたが、それを機能させることができないようです。
データは、強度値の2次元マトリックスです。ある種のイメージを作成したい。その学校のプロジェクト。
解決
フー!大きな主題。
"右"答えは、問題のドメインとあなたがしていることのさまざまな詳細に多く依存します。
複数の次元で補間するには、いくつかの選択が必要です。通常のグリッドにプロットしているが、一部のグリッドポイントにはデータがないと仮定します。大きな質問:欠けている点はまばらですか、それとも大きな塊を作るのですか?
情報を追加することはできません ので、見た目が良い何かを確立しようとしています。
概念的にシンプルな提案(ただし、実装には多少の作業が必要な場合があります):
欠損データの各領域について、すべてのエッジポイントを特定します。この図でxを見つけます
oooxxooo
oox..xoo
oox...xo
ox..xxoo
oox.xooo
oooxoooo
。はデータが欠落しているポイントで、xとoはデータがあります(単一の欠落ポイントの場合、これは4つの最近傍になります)。欠落している各データポイントを、このブロブの周囲のエッジポイントの平均値で埋めます。スムーズにするには、各ポイントに 1 / d
で重み付けします。dは、2つのポイント間のタクシー運転手の距離(デルタx +デルタy)です。
詳細がわかる前から:
そのような情報がない場合、直進線形補間を試みましたか?データが適度に密集している場合、これはあなたのために行うかもしれませんし、必要なときにインラインでコーディングするのに十分簡単です。
次のステップは通常3次スプラインですが、そのためにはおそらく既存の実装を取得する必要があります。
クイック線形補間よりも強力なものが必要な場合、通常は ROOT を使用します(そして、 TSplineクラス)、ただし、これは必要以上のオーバーヘッドになる可能性があります。
コメントに記載されているように、ROOTは big であり、高速ではありますが、ROOT方式で強制的に実行しようとするため、プログラムに大きな影響を与える可能性があります。
2点(x1、y1)と(x2、y2)の間の線形補間(または実際の外挿)により、
y_i = (x_i-x1)*(y2-y1)/(x2-x1)
他のヒント
補間は複雑な主題です。一連のポイントを補間する方法は無限にありますが、これは、どんな種類のスムージングでもなく、本当に補間を行いたいと思っていることを前提としています。 (補間関数は元のデータポイントを正確に再現します。)そしてもちろん、この問題の2次元の性質により、事態はさらに困難になります。
2-dの散布データの補間には、いくつかの一般的なスキームがあります。実際、それにアクセスできる人のために、非常に素晴らしい論文が用意されています(Richard Franke、「散在データ補間:いくつかの方法のテスト」、Mathmatics of Computation、1982年)
おそらく最も一般的な方法は、データの三角測量に基づいています。データポイントからドメインの三角形分割を作成するだけです。次に、データの凸包の内側のポイントは、三角形のちょうど1つの内側にある必要があります。そうでない場合、共有エッジ上にあります。これにより、三角形の内側で直線的に補間できます。 MATLABを使用している場合、関数griddataはこの明示的な目的に使用できます。)
散乱点から完全な長方形の画像を作成しようとするときの問題は、データが配列の4つの角まで伸びていない可能性が高いことです。その場合、配列の角が散乱点の凸包の内側にないため、三角形分割に基づくスキームは失敗します。その場合の代替策は、「放射基底関数」を使用することです。 (多くの場合、RBFと略されます)。地球統計学コミュニティで使用される場合、クリギングを含む多くのそのようなスキームがあります。
http://en.wikipedia.org/wiki/Kriging
最後に、修復は、要素が配列で指定されているが、欠落している要素がある補間スキームの名前です。この名前は明らかに、貴重な芸術作品の裂け目や裂け目を修復する必要がある芸術家によって行われたものを指します。
http://en.wikipedia.org/wiki/Inpainting
修復の背後にある考え方は、通常、境界値の問題を定式化することです。つまり、穴のある領域で偏微分方程式を定義します。既知の境界値を使用して、未知の要素のPDEを解くことにより穴を埋めます。膨大な数の未知の要素がある場合、これは通常、少なくとも大規模なスパース線形方程式の解を必要とするため、計算量が多くなります。 PDEが非線形の場合、それはさらに集中的な問題になります。 PDEの単純で合理的に適切な選択はラプラシアンであり、これにより線形システムが適切に外挿されます。繰り返しますが、MATLABユーザー向けのソリューションを提供できます。
http://www.mathworks.com/matlabcentral/fileexchange/4551
PDEのより良い選択は、非線形PDEから得られる場合があります。そのようなものがナビエ/ストークス方程式です。通常見られるタイプのサーフェスのモデリングに適していますが、対処するのがより困難です。人生の多くの面でそうであるように、あなたはあなたが支払うものを手に入れます。
これは単純な学校プロジェクトであると考えると、おそらく最も実装が簡単な補間手法は「最近傍」
不足している各データポイントについて、最も近い「塗りつぶし」を見つけます。データポイントを値として使用します。
結果をもう少し改善したい場合は、たとえば、最も近いK個のデータポイントを見つけ、それらの加重平均を欠損データポイントの値として使用できます。
重みは、欠落したデータポイントからポイントまでの距離に比例する可能性があります。
他にも無数のテクニックがありますが、おそらく最も近いものが実装が最も簡単です。
あなたのニーズが次のとおりであることがわかった場合。
LからWの次元のx、y、Intensityのサブセットがあり、0からLの範囲のすべてのXと0からWの範囲のYをすべて埋めたいと思います。
これがあなたの質問である場合、解決策はフィルターを使用して他の強度を取得することです。
バイエルフィルターまたはガウスフィルターがあなたのために仕事をするだろうと思います。
これらのフィルターをグーグルで検索すると、実装する回答が得られます。
幸運を祈ります。