gpt4 book ai didi

matlab - 图像处理问题 : Fill NaNs in image,,主要由 NaN 组成

转载 作者:行者123 更新时间:2023-12-04 04:54:24 26 4
gpt4 key购买 nike

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

enter image description here

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

图像中的彩色像素表示范围从 0 到大约 400 米的高度/深度。蓝色像素为 NaN .

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

我尝试使用函数 inpaint_nans从文件交换中,它经常一次又一次地帮助我,它做得很好:

enter image description here

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)

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

编辑:处理:

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

最佳答案

你可以试试 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);

关于matlab - 图像处理问题 : Fill NaNs in image,,主要由 NaN 组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16980931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com