Asp*_*ife 8 matlab image image-processing
比方说,我有这个图片此:
有黑色划痕,我想从我的图像中删除它.我知道这是噪音.我尝试过邻域滤波器和高斯滤波器,但没有成功.
Nik*_*iki 22
如果您知道划痕的位置,则此问题称为修复,并且有非常复杂的算法.因此,一种方法是尽可能好地检测划痕,然后在其上使用标准的修复算法.我在Mathematica中玩了一下你的形象:
首先,我对图像应用了中值滤波器.当你发现自己时,这会消除划痕,但也会删除很多细节.中位数和原始图像之间的差异是一个很好的指标,但是:
当我用手动选择的阈值对这个图像进行二值化时,我会得到一个快速且脏的划痕检测器:
如果您对划痕的外观有更多了解,可以大大改进这种探测器.例如,划痕总是黑暗的吗?他们总是有高对比度吗?它们总是平滑的曲线,即曲率总是低吗? - 可以以某种方式测量这些属性中的每一个,因此您可以将这些测量结果组合到单个图像中并对其进行二值化.
一个小的改进是删除小组件:
这仍然不完美,但结果足以将其用作修复遮罩:
这也将删除一些细节,但差异更难以发现.
完整的Mathematica代码:
difference = ImageDifference[sourceImage, MedianFilter[sourceImage, 2]];
mask = DeleteSmallComponents[Binarize[difference, 0.15], 15];
Inpaint[sourceImage, mask]
Run Code Online (Sandbox Code Playgroud)
编辑:
如果您无法访问标准的修复算法(如Navier Stokes或Telea),那么穷人的算法就是在掩码为1的区域中使用中值滤波图像(可能类似于mask*sourceImage + (1-mask)*medialFilteredImage
Matlab).根据图像数据,差异可能不值得"真正的"修复算法的额外努力: