-1

我有一个图像(或矩阵),其中绝大多数点等于 NaN,只有几个点(在示例中显示为蓝色)是已知的。我想更改此图像(或矩阵)的分辨率,如 imresize。但是,问题是 imresize 不适用于填充 NaN 的矩阵,如果我想用其他值替换 NaN 值,最终的插值也不正确。有什么解决办法吗?一种解决方案可能是使用特定邻域的反距离,然后找到新的粗分辨率值。

显示稀疏点的示例图

4

2 回答 2

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 回答
0

我只会勾勒出一个可行的解决方案:

  1. 在值有效的地方制作矩阵的掩码
  2. 调整该蒙版的大小
  3. 重新填写值

前两个步骤非常简单:

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 回答