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