-1

ポイントの大部分が NaN に等しく、例では青で示されている少数のポイントのみが既知である画像 (または行列) があります。この画像 (または行列) の解像度を imresize として変更したい。しかし、問題は、imresize が NaN で満たされた行列では機能しないことです。NaN 値を他の値に置き換えたい場合、最終的な補間も正しくありません。これに対する解決策はありますか?1 つの解決策は、特定の近傍で逆距離を使用してから、新しい粗い解像度の値を見つけることです。

まばらな点を示すプロットの例

4

2 に答える 2

0

うまくいくかもしれない解決策だけをスケッチします:

  1. 値が有効なマトリックスのマスクを作成します
  2. そのマスクのサイズを変更します
  3. 値を入力し直します

最初の2つのステップは非常に簡単です。

mask      = ~isnan(data);
largeMask = imresize(mask, factor);
largeImage = largeMask;

トリッキーな部分は最後のステップにありますが、これは実装しませんが、私がやろうとしていることだけを示しています。サイズ変更されていないデータ()で有効な値を並べindex = find(~isnan(data))替えます。そうすれば、大きなデータでその順序を復元できる場合は、それらを埋め戻すことができます。復元するにはx,y、各データポイントの座標を計算する必要があります。小さな行列で、自分で大きな行列に変換し、隣接するものを見つけて入力します。

編集:マスクのサイズを変更し、データのサイズを変更してNaN、ポイントの値を歪めない値に置き換えてから、変換されたマスクを画像に再適用してNaNを元の位置に戻すと良い結果が得られる場合があります。とにかく、これは、データの補間方法を指定しないため、または値が有効かどうかを検討するときに、暗闇の中でのショットにすぎません。

いくつかの問題の良い出発点は、アクションを手動で(またはGIMP / Photoshopなどを使用して)実行してから、コードで実装することです。

于 2012-10-03T06:16:12.060 に答える
0

単純な最近傍を使用できます。

img2 = kron(img, ones(2))  %# for scale factor 2
img2 = kron(img, ones(3))  %# for scale factor 3
...

唯一の欠点は、整数値のスケール係数しか持てないことです。NaN補間によるサイズ変更はまったく不可能であるため、これは完全に理にかなっています。

別の方法として、

img(isnan(img)) = -1;          %# or something else more suited
img2 = imresize(img, 1.2)      %# resize your img normally

img2(img2~=1 | img~=0) = NaN;  %# make everything that's not valid NaN again
于 2012-10-03T04:44:46.403 に答える