我正在做一个带有深度图像的项目。但是我的深度相机有噪音和像素读取失败的问题。有一些点和轮廓(尤其是边缘)的值为零。如何忽略这个零值并将其与周围的值混合?我已经尝试过dilation和erosion(变形图像处理),但我仍然无法获得正确的组合。它确实消除了一些噪音,但我只需要消除所有点的零
图像示例:
零值是最深的蓝色(我正在使用颜色图)
为了说明我想做什么,请参考这张糟糕的油漆图:
我想摆脱黑点(例如黑色值为 0 或某个值),并将其与其周围混合。是的,我可以使用np.where或 类似功能定位该点,但我不知道如何混合它。也许要应用过滤器?我需要在流中执行此操作,因此我需要一个相当快的过程,也许 10-20 fps 就可以了。先感谢您!
更新 :
除了inpaint还有别的方法吗?我已经寻找了各种修复,但我不需要像修复那样复杂。我只需要将它与简单的线条、曲线或形状和一维混合。我认为inpaint是一种矫枉过正。此外,我需要它们足够快以用于 10-20 fps 的视频流,甚至更好。
我有一个2d数组(doubles)代表一些数据,它有一堆数据NaNs.数据的等高线图如下所示:

所有的白色空间都是NaNs灰色菱形,供参考,填充的轮廓显示我的数据形状.当我使用过滤数据时imfilt,NaNs显着地咀嚼数据,所以我们最终会得到这样的结果:

您可以看到支持集显着缩小.我无法使用它,因为它已经咀嚼了边缘上的一些更有趣的变化(由于我的实验特定的原因,这些边缘很重要).
是否有一个函数可以在一个孤岛中进行过滤NaNs处理边缘,类似于矩形过滤窗口的边缘,而不仅仅是杀死边缘?有点像nanmean功能,除了卷积图像?
这是我的过滤器代码:
filtWidth = 7;
imageFilter=fspecial('gaussian',filtWidth,filtSigma);
%convolve them
dataFiltered = imfilter(rfVals,imageFilter,'symmetric','conv');
Run Code Online (Sandbox Code Playgroud)
和绘制等高线图的代码:
figure
contourf(dataFiltered); hold on
plot([-850 0 850 0 -850], [0 850 0 -850 0], 'Color', [.7 .7 .7],'LineWidth', 1); %the square (limits are data-specific)
axis equal
Run Code Online (Sandbox Code Playgroud)
Mathworks文件交换(ndanfilter.m)中有一些代码接近我想要的,但我相信它只是插NaNs在图像内部的插值,而不是显示这种岛型效果的数据.
注意:我刚刚找到了nanconv.m,它完全符合我的要求,具有非常直观的用法(卷积图像,忽略NaN,非常像nanmean作品).我已经将这部分作为我接受的答案,并将其与其他答案的表现进行了比较.
相关问题