2

我有一个DD像这张图片中的数据集/图片:

在此处输入图像描述

(顺便说一句:有没有办法在这里上传小数据集,这样你就可以实际使用我使用的相同数据,而不必将它们放入代码中?)

图像中的彩色像素代表从 0 到大约 400 米的高度/深度。蓝色像素是NaN

现在我需要做的是在显示的对象内插入像素值,但不插入整个图像。

我尝试使用inpaint_nans文件交换中的功能,它经常帮助我,它做得很好:

在此处输入图像描述

imagesc(inpaint_nans(DD,4))

但是,对于约 3000x3000 像素的大图像(我有其中的一些!),运行时间相当长,而且这并不完全是我正在寻找的。图像处理工具箱中是否有一个函数可以将插值限制在对象的现有边界而不考虑周围的 NaN?

我也interp2这样用过:

[xi,yi] = meshgrid(1:size(DD,2),1:size(DD,1));
zi = interp2(xi,yi,DD,xi,yi,'method');
imagesc(zi)

我尝试过的地方linearnearest以及cubicmethod他们都没有完成这项工作。nearest没有做任何事情,而其余的则删除了越来越多的“好”像素并将它们替换为NaNs。任何帮助或建议将不胜感激!

编辑:处理:

我在另一个基于三角形网格的程序中运行了模拟。对于网格的每个节点 (X,Y),水深被写入一个 ascii 文件。在流的中心,两个三角形适合一个像素(90x90 米),例如,我得到一个像素角的水深值,而不是像素本身。在周围,模拟以较大的间距工作(从洪泛区内的常规 NaN 值可以明显看出)。在这里,2 个三角形组成了一个 180x180 米(4 像素)的矩形。因为我只再次获得三角形节点的值,所以计算出的水深值被分配给每一秒,而不是每个像素。现在我想,最简单的方法是在像素之间进行插值。另一个有效(也许更好)的解决方案是将节点值(深度)分配给周围的 2 / 4 像素: 没有说明

4

2 回答 2

2

你可以试试这个TriScatteredInterp功能。它在我的简单测试中运行良好:

% create an image with holes
x = im2double(imread('rice.png'));
x(1:4:end, 1:4:end) = nan;
x(rand(size(x))<.1) = nan;
figure; imshow(x);

% setup the grid to interp from
[m n c] = size(x);
[N M] = meshgrid(1:m, 1:n);
Ni = N;
Mi = M;

Mi(~isnan(x)) = [];
Ni(~isnan(x)) = [];

N(isnan(x)) = [];
M(isnan(x)) = [];
Z = x(~isnan(x));

% do the interp
F = TriScatteredInterp(M', N', Z);
Zi = F(Mi, Ni);

xi = x;
xi(sub2ind(size(x),Mi, Ni)) = Zi;
figure; imshow(xi);
于 2013-08-22T20:21:13.010 回答
1

我有类似的情况,简单的 imdilate 对我有用。TriScatteredInterp很慢。这篇文章很旧,但可能以下代码对某人有帮助:

imgDepth = load('depthImage.mat') % Or imread('depthImage.png')
imgDepth(isnan(imgDepth)) = 0
radius = 10 % Change as per your data
se = strel('disk',radius) % Try different structuring elements as per your need
imgDilated = imdilate(imgDepth,se);
figure,imshow(imgDilated,[]),colormap(jet)
于 2015-05-10T20:16:07.107 回答