如何使用matlab从图像中删除划痕

时间:2011-12-27 14:07:29

标签: image matlab image-processing

假设我有这张图片this

enter image description here

黑色划痕,我想从我的图像中删除它。我知道这是噪音。我尝试过邻域滤波器和高斯滤波器,但没有成功。

3 个答案:

答案 0 :(得分:22)

如果您知道划痕的位置,则此问题称为inpainting,并且存在非常复杂的算法。因此,一种方法是尽可能好地检测划痕,然后在其上使用标准的修复算法。我在Mathematica中玩了一下你的形象:

首先,我对图像应用了中值滤波器。当你发现自己时,这会消除划痕,但也会删除很多细节。中位数和原始图像之间的差异是一个很好的指标,但是: difference between median and original image

当我用手动选择的阈值对图像进行二值化时,我会得到一个快速且肮脏的划痕检测器: Binarized

如果您对划痕的外观有更多了解,可以大量改进此探测器。例如划痕总是黑暗的吗?他们总是有高对比度吗?它们总是平滑的曲线,即曲率总是低吗? - 可以以某种方式测量这些属性中的每一个,因此您将这些测量值组合到单个图像中并将其二值化。

一个小的改进是删除小组件: DeleteSmallComponents

这仍然不完美,但结果足以将其用作修复遮罩: inpainting

这也将删除一些细节,但差异更难以发现。

Full Mathematica代码:

difference = ImageDifference[sourceImage, MedianFilter[sourceImage, 2]];
mask = DeleteSmallComponents[Binarize[difference, 0.15], 15];
Inpaint[sourceImage, mask]

修改

如果您无法使用标准的修复算法(如Navier Stokes或Telea),那么穷人的算法就是在掩码为1的区域使用中值滤波图像(可能类似于{在Matlab中{1}}。根据图像数据,差异可能不值得“真正的”修复算法的额外努力:

Poor man's inpainting

答案 1 :(得分:0)

filter for Avisynthplugin for VirtualDub(我最喜欢的两个视频编辑工具)。它几乎不会比这两个好(如果你真的需要自己实现它,你可以从中学习)。

答案 2 :(得分:0)

我的结果使用带ImageJ的中值滤镜

enter image description here