最佳答案
如果您知道划痕的位置,则此问题称为 inpainting ,并且有非常复杂的算法。因此,一种方法是尽可能地检测划痕,然后对其使用标准的修复算法。我在 Mathematica 中玩过你的图像:
首先,我对图像应用了中值滤波器。正如您自己发现的那样,这会消除划痕,但也会消除很多细节。不过,中值图像和原始图像之间的差异可以很好地指示您的划痕:
当我使用手动选择的阈值将此图像二值化时,我得到了一个快速且脏的划痕检测器:
如果您对划痕的外观有更多了解,则可以大大改进此检测器。例如划痕总是深色的吗?他们总是有高对比度吗?它们是否总是平滑的曲线,即它们的曲率是否总是很低? - 这些属性中的每一个都可以以某种方式测量,因此您可以将这些测量结果组合成一个图像并将其二值化。
一个小的改进是删除小组件:
这仍然不完美,但结果足以将其用作修复蒙版:
这也会删除一些细节,但差异更难发现。
完整的 Mathematica 代码:
difference = ImageDifference[sourceImage, MedianFilter[sourceImage, 2]];
mask = DeleteSmallComponents[Binarize[difference, 0.15], 15];
Inpaint[sourceImage, mask]
编辑:
如果您无法使用标准修复算法(如 Navier Stokes 或 Telea),穷人的算法将是在掩码为 1 的那些区域使用中值滤波图像(可能类似于 mask*sourceImage + (1-mask)*medialFilteredImage
在 Matlab 中)。根据图像数据,差异可能不值得“真正的”修复算法的额外努力:
关于image - 如何使用matlab去除图像上的划痕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8645515/