如何使用MATLAB消除图像中的划痕

7
假设我有这张图片:这里, 有一个黑色的划痕,我想把它从我的图片中移除。我知道这是噪点。我尝试过邻域滤波器和高斯滤波器,但都没有成功。

了解您已经尝试过什么(如果有的话)将会很有帮助。 - ArjunShankar
好吧,我曾经想过我们可以识别受噪声干扰的像素并应用滤波。为此目的识别一个滤波器是一项任务。 - Asp.net my life
我尝试了中值滤波,它确实起到了作用,但是会使图像模糊很多。不过,我首先将其转换为灰度图像...如果我想从RGB图像中去除划痕怎么办? - Asp.net my life
1
这个划痕的位置已知吗? - nojka_kruva
不,不是这样的.. 我必须想办法检测出该区域并开发一种去除它的方法。 - Asp.net my life
3个回答

22
如果您知道划痕的位置,这个问题被称为图像修复,有非常复杂的算法可以解决。因此,一种方法是尽可能好地检测到划痕,然后在其上使用标准的图像修复算法。我在Mathematica中对您的图像进行了一些处理:
首先,我对图像应用了一个中值滤波器。正如您自己发现的那样,这会去除划痕,但也会去除很多细节。然而,中值图像和原始图像之间的差异是一个很好的划痕指示器: difference between median and original image 当我使用手动选择的阈值将此图像二值化时,我得到了一个快速且简单的划痕检测器: Binarized 如果您更了解您的划痕外观,您可以大大改善此检测器。例如,划痕总是暗色的吗?它们总是具有高对比度吗?它们总是光滑曲线吗,即它们的曲率总是低的?-每个属性都可以以某种方式进行测量,因此您将这些测量组合到单个图像中并将其二值化。
一个小改进是去除小组件: DeleteSmallComponents 这仍然不完美,但结果已经足够好,可以用作修复蒙版: inpainting 这也会去除一些细节,但差异更难以察觉。
完整的Mathematica代码:
difference = ImageDifference[sourceImage, MedianFilter[sourceImage, 2]];
mask = DeleteSmallComponents[Binarize[difference, 0.15], 15];
Inpaint[sourceImage, mask]

编辑:

如果您没有访问标准修补算法(如Navier Stokes或Telea)的权限,则可以使用中值滤波图像作为贫困算法,在掩模为1的区域中使用(在Matlab中可能类似于mask*sourceImage + (1-mask)*medialFilteredImage)。根据图像数据,与“真正”的修补算法相比,差异可能不值得额外的努力:

Poor man's inpainting


非常好,谢谢!按照您的建议,我首先使用掩模[5 5]应用了中值滤波器,其次从原始图像中减去我的图像并获得第一张图像。第三步,我将图像二值化,阈值为0.7,并得到了这张图片https://picasaweb.google.com/113201095350972874862/December27201102#5690835622483741362。有没有办法可以移除我检测到的划痕并从此图像中移除它? - Asp.net my life
1
@user1009156:Mathematica、IPP、OpenCV都有内置的修复函数,所以我从来没有自己实现过。这并不是一件简单的事情。最简单的方法可能是在谷歌上搜索“Inpainting+Matlab”,然后查找代码示例。 - Niki
2
查阅有关修复和去除遮挡的“等高线”学术论文。该技术可以处理照片中相当严重的损坏。一些论文:Masnou和Morel的“基于等高线的去遮挡” math.univ-lyon1.fr/~masnou/fichiers/publications/icip.pdfBertalmio,Sapiro,Caselles和Ballester的“图像修复”。 - Rethunk

0

使用ImageJ进行中值滤波的结果

enter image description here


0

一个Avisynth的过滤器和一个VirtualDub的插件(我的两个最喜欢的视频编辑工具)。这两个工具几乎是最好的选择(如果你真的需要自己实现,你可以从它们中学习)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接