更改稀疏填充矩阵的图像点分辨率

时间:2012-10-02 19:51:40

标签: image matlab image-processing sparse-matrix

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

Example plot showing sparse points

2 个答案:

答案 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)

我只会草拟一个可行的解决方案:

  1. 制作值有效的矩阵掩码
  2. 调整面具大小
  3. 将值填回
  4. 前两个步骤非常简单:

    mask      = ~isnan(data);
    largeMask = imresize(mask, factor);
    largeImage = largeMask;
    

    棘手的部分是在最后一步,我不会实现,但只显示我试图做的事情。我会在未提取数据(index = find(~isnan(data)))中订购有效值,这样如果您可以在较大数据中恢复该排序,则可以将它们重新填入。对于该恢复,您可能需要计算小矩阵中每个数据点的x,y坐标,自己将其转换为大矩阵,找到它的邻居并填写。

    编辑:当你调整掩码大小时,你可能会得到很好的结果,调整数据大小,NaN替换为一些不会扭曲点值的值,然后重新调整将变换后的蒙版应用于图像,将NaN重新放回原位。无论如何,这只是在黑暗中拍摄,因为您没有指定数据应该如何插值或者您认为值是否有效。

    我认为某些问题的一个好的起点是尝试手动执行操作(或者使用GIMP / Photoshop),然后尝试在代码中实现它。