我有一个像这张图片中的数据集/图像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)
我为linear
尝试了nearest
,cubic
和method
。他们没有完成这项工作。 nearest
没有做任何事情,而其他人删除了越来越多的“好”像素,并用NaN
代替了它们。任何帮助或建议将不胜感激!
编辑:处理:
我在一个基于三角形网格的不同程序中运行模拟。对于网格的每个节点(X,Y),水深被写入ascii文件。在流的中心,2个三角形适合一个像素(90×90米),例如,我获得像素角的水深值,而不是像素本身。在周围,模拟以较大的间距工作(从泛滥平原内的常规NaN值可以看出)。这里,2个三角形组成180x180米(4像素)的矩形。因为我只获得三角形节点的值,所以计算的水深值被分配给每秒,而不是每个像素。 现在我想,最简单的方法是在像素之间进行插值。另一个有效(可能更好)的解决方案是将节点值(深度)分配给周围的2/4像素:
答案 0 :(得分: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);
答案 1 :(得分:0)
我有类似的情况和简单的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)