ポイントの大部分が NaN に等しく、例では青で示されている少数のポイントのみが既知である画像 (または行列) があります。この画像 (または行列) の解像度を imresize として変更したい。しかし、問題は、imresize が NaN で満たされた行列では機能しないことです。NaN 値を他の値に置き換えたい場合、最終的な補間も正しくありません。これに対する解決策はありますか?1 つの解決策は、特定の近傍で逆距離を使用してから、新しい粗い解像度の値を見つけることです。
2 に答える
うまくいくかもしれない解決策だけをスケッチします:
- 値が有効なマトリックスのマスクを作成します
- そのマスクのサイズを変更します
- 値を入力し直します
最初の2つのステップは非常に簡単です。
mask = ~isnan(data);
largeMask = imresize(mask, factor);
largeImage = largeMask;
トリッキーな部分は最後のステップにありますが、これは実装しませんが、私がやろうとしていることだけを示しています。サイズ変更されていないデータ()で有効な値を並べindex = find(~isnan(data))
替えます。そうすれば、大きなデータでその順序を復元できる場合は、それらを埋め戻すことができます。復元するにはx,y
、各データポイントの座標を計算する必要があります。小さな行列で、自分で大きな行列に変換し、隣接するものを見つけて入力します。
編集:マスクのサイズを変更し、データのサイズを変更してNaN
、ポイントの値を歪めない値に置き換えてから、変換されたマスクを画像に再適用してNaNを元の位置に戻すと良い結果が得られる場合があります。とにかく、これは、データの補間方法を指定しないため、または値が有効かどうかを検討するときに、暗闇の中でのショットにすぎません。
いくつかの問題の良い出発点は、アクションを手動で(またはGIMP / Photoshopなどを使用して)実行してから、コードで実装することです。
単純な最近傍を使用できます。
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