Image 缩小某些项未知的矩阵

Image 缩小某些项未知的矩阵,image,matlab,image-processing,signal-processing,Image,Matlab,Image Processing,Signal Processing,我有一个二维网格(G=250x250),其中只有大约100个点是已知的,其余的点是未知的(NaN)。我想调整这个矩阵的大小。我的问题是,imresize无法在MATLAB中为我执行此操作,因为它删除了我的已知值,只给出了一个NaN矩阵 有人知道能帮我做这件事的方法吗?一个建议是使用插值方法(例如,使用反向距离加权),但我不确定它是否有效,甚至不确定是否有更好的方法 G = NaN(250,250); a = ceil(rand(1,50)*250*250); b = ce

我有一个二维网格(G=250x250),其中只有大约100个点是已知的,其余的点是未知的(NaN)。我想调整这个矩阵的大小。我的问题是,
imresize
无法在MATLAB中为我执行此操作,因为它删除了我的已知值,只给出了一个NaN矩阵

有人知道能帮我做这件事的方法吗?一个建议是使用插值方法(例如,使用反向距离加权),但我不确定它是否有效,甚至不确定是否有更好的方法

    G = NaN(250,250);
    a = ceil(rand(1,50)*250*250);
    b = ceil(rand(1,50)*250*250);
    G (a) = 1; G (b) = 0;
这个怎么样:

% find the non-NaN entries in G
idx = ~isnan(G);

% find their corresponding row/column indices
[i,j] = find(idx);

% resize your matrix as desired, i.e. scale the row/column indices
i = ceil(i*100/250);
j = ceil(j*100/250);

% write the old non-NaN entries to Gnew using accumarray
% you have to set the correct size of Gnew explicitly
% maximum value is chosen if many entries share the same scaled i/j indices
% NaNs are used as the fill
Gnew = accumarray([i, j], G(idx), [100 100], @max, NaN);

如果max不适合您,您也可以为accumarray选择不同的累积函数。如果填充值不是您需要的,您可以将填充值从NaN更改为其他值。

imresize
返回
NaN
s,因为原始矩阵具有
NaN
s。我认为您应该将
NaN
s替换为零,调用imresize,然后有选择地将零还原回
NaN
s。还有,你所说的“调整矩阵大小”是什么意思?你想插值还是只添加元素而不改变矩阵中的现有值?@Eitan:我只想调整矩阵大小,并将这100个数据分配给粗网格上最合适的节点。我想如果我使用插值,一切都会改变!因此,我希望在不改变值的情况下调整矩阵的大小。此外,我无法将NaN值替换为0或1,因为它将与我当前的已知数据混合,并且我会失去准确性。mResize不会调整矩阵大小,而是缩放图像。这涉及插值,所以使用NAN不会很好地工作。@Angainor:这就是为什么我说一种解决方案可能使用插值,但我不知道如何使用@山姆,我没有跟踪你。假设你有
A=[12;3nan]。你只想用零来“填充”矩阵,以获得一个10x10矩阵(包含原来的四个元素和其余的零),或者对其进行插值以获得一个新的10x10矩阵?多谢了。它工作:),但它是如何工作的?你能给我简要解释一下吗?或网页阅读。@Sam我对代码进行了注释。我只需重新缩放非nan项的行和列的索引,并通过为新行/列索引赋值来创建新矩阵。非常基本的东西,没有插值。阅读accumarray的帮助,了解它的具体功能。@Angainor:我认为有点不对劲:(.我的意思是,想象一下你正在近距离观看一张图片(精细网格),在本例中,您可以看到细节,但当您走远时,分辨率将发生变化,因此值将相应地发生变化。我的意思是,在较粗的网格中,这些值(非NaN像素)与更精细的值不同。在这种情况下,可能需要对较粗的中心像素进行插值,是吗?@Sam这确实取决于您要执行的操作:)我的代码只执行上述操作。如果你能使用它完全取决于你自己。我不知道如何从远处看,我知道如何在matlab中编程。决定如何处理粗化值,并在accumarray中设置适当的函数而不是最大值。或者如果你想做的是插值,就做插值。玩一下,看看有什么效果。