我有一个图像(或矩阵),其中绝大多数点等于NaN,只有几个点,在示例中显示为蓝色,是已知的。我想改变这个图像(或矩阵)的分辨率。但是,问题是imresize不适用于填充NaN的矩阵,如果我想用其他值替换NaN值,最终插值也不正确。这有什么解决方案吗?一种解决方案是使用与特定邻域的反距离,然后找到新的粗分辨率的值。
答案 0 :(得分: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
答案 1 :(得分:0)
我只会草拟一个可行的解决方案:
前两个步骤非常简单:
mask = ~isnan(data);
largeMask = imresize(mask, factor);
largeImage = largeMask;
棘手的部分是在最后一步,我不会实现,但只显示我试图做的事情。我会在未提取数据(index = find(~isnan(data))
)中订购有效值,这样如果您可以在较大数据中恢复该排序,则可以将它们重新填入。对于该恢复,您可能需要计算小矩阵中每个数据点的x,y
坐标,自己将其转换为大矩阵,找到它的邻居并填写。
编辑:当你调整掩码大小时,你可能会得到很好的结果,调整数据大小,NaN
替换为一些不会扭曲点值的值,然后重新调整将变换后的蒙版应用于图像,将NaN重新放回原位。无论如何,这只是在黑暗中拍摄,因为您没有指定数据应该如何插值或者您认为值是否有效。
我认为某些问题的一个好的起点是尝试手动执行操作(或者使用GIMP / Photoshop),然后尝试在代码中实现它。