我有一个图像(或矩阵),其中绝大多数点等于 NaN,只有几个点(在示例中显示为蓝色)是已知的。我想更改此图像(或矩阵)的分辨率,如 imresize。但是,问题是 imresize 不适用于填充 NaN 的矩阵,如果我想用其他值替换 NaN 值,最终的插值也不正确。有什么解决办法吗?一种解决方案可能是使用特定邻域的反距离,然后找到新的粗分辨率值。
问问题
671 次
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
我只会勾勒出一个可行的解决方案:
- 在值有效的地方制作矩阵的掩码
- 调整该蒙版的大小
- 重新填写值
前两个步骤非常简单:
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 回答