从照片中去除纸张纹理图案

30
我扫描了一张带有纸质纹理的老照片,想尽可能地去除纹理而不降低图像质量。是否有一种方法,可能使用MATLAB中的图像处理工具箱?我已经尝试应用FFT变换(使用Photoshop插件),但我找不到任何清晰的白点来涂抹。也许这种方法对于该模式不是很规则?您可以在下面看到样本。如果需要完整的图像,我可以上传到某个地方。photograph sample

给一个有趣的问题点个赞。你能把原始图像放在某个地方吗?我很好奇我的方法如何适用于整个图像。 - mpenkov
感谢大家回答并点赞这个问题。很抱歉回复有所延迟。这是我岳母的照片,她几天前去世了。我在这里上传了完整的图片:http://img811.imageshack.us/img811/5827/file0011m.jpg - yuk
4个回答

23

不幸的是,这种图案并不是足够重复的,所以傅里叶分析并不适用于这种情况,你只能固守于空间领域。

正如 @Jonas 和 @michid 所指出的,滤波可以帮助你解决这样的问题。在滤波过程中,你需要权衡要保留的细节和要消除的噪声(或不需要的图像组件)之间的关系。例如,@Jonas 使用的中值滤波器可以完全消除纸张纹理(甚至是图像底部附近的圆形划痕),但同时也会消除眼睛、头发、面部和背景中的所有纹理(虽然我们并不太关心背景,但前景很重要)。此外,你还会看到图像对比度略微降低,这通常是不可取的,它会使图像看起来不自然。

以下是我处理这个问题的方法:

  • 检测纸张纹理图案:
    • 将高斯模糊应用于图像(使用大核以确保所有的纸张纹理信息都被破坏)
    • 计算模糊和原始图像之间的图像差异
    • 编辑2 对差异图像应用高斯模糊(使用小的3x3核)
  • 使用经验确定的阈值对上述图案进行阈值处理。这将产生一个二进制图像,可用作掩膜。
  • 仅使用中值滤波器(如 @Jonas 所提到的)来替换与纸张图案对应的图像部分。

纸张纹理图案(阈值化之前):

enter image description here

你希望在上面的图像中尽可能少地包含实际的图像信息。你会发现你可以非常微弱地看到脸的边缘(这不太好,但这是我能做的最好的了)。你还希望这个纸张纹理图像尽可能均匀(以便在整个图像上进行阈值处理时得到相等的结果)。再次强调,上面的图像右侧略微偏暗,这意味着对它进行良好的阈值处理将会很困难。

最终图片:

enter image description here

结果并不完美,但它已经完全消除了明显的纸张纹理,并保留了比简单滤波方法更多的高频内容。

编辑

填充区域通常是纯色的,因此如果您仔细观察图像,它们会稍微显眼。您还可以尝试在填充区域添加一些低强度零均值高斯噪声,使它们看起来更真实。您需要选择与背景匹配的噪声方差。经验上确定可能已经足够。

这是加入噪声的处理后的图像:

enter image description here

请注意,去除纸张纹理的部分更难以看到,因为添加的高斯噪声掩盖了它们。我对整个图像使用了相同的高斯分布,但如果您想更加复杂,可以为脸部、背景等使用不同的分布。


非常感谢。有趣的方法,结果看起来非常不错。你是用MATLAB还是像Photoshop这样的软件做的?如果是用MATLAB,能否分享一下代码?请检查完整的图片,链接在我对问题的评论中。 - yuk
@yuk:我用GIMP进行了第一步(检测纸张纹理),然后使用Python/OpenCV完成了其余部分。我认为在MATLAB中完全可以做到这一点——只是我在家里的电脑上没有访问权限。如果你想看我的Python源代码,我可以把它放在这里或者邮件给你。 - mpenkov
@yuk:我忘记在我的解释中添加第二个高斯模糊步骤了。请查看我更新的答案。 - mpenkov
我认为你使用的Python代码对于阅读这个问题的每个人都会有所帮助。只需将其附加到您的答案中即可。再次感谢您。 - yuk
@yuk:你可能已经超越了这个问题,但我最近一直在玩OpenCV,并将此问题用作演示。源代码在这里:https://github.com/mpenkov/sandpit/tree/master/stackoverflow。抱歉花费了这么长时间。 - mpenkov
请注意,有效的边缘也会进入掩膜中,因为它们产生强烈的响应,所以可能会受损。一种解决方案是使用双阈值处理。(?) - user21508463

13

中值滤波可以稍微帮助一下:

img = imread('http://i.stack.imgur.com/JzJMS.jpg');
%# convert rgb to grayscale
img = rgb2gray(img);
%# apply median filter
fimg = medfilt2(img,[15 15]);
%# show
imshow(fimg,[])

enter image description here

请注意,您可能希望首先填充图像,以避免边缘效应。

编辑:比[15 15]小的滤波器核将更好地保留图像纹理,但会留下更多可见的滤波痕迹。


谢谢你的解决方案,Jonas。我会尝试你和Misha的方法并进行比较。 - yuk

3
我尝试了一种不同的方法,使用作用于更广区域的第二系数的各向异性扩散。
以下是我的输出结果: enter image description here

1
从图片中可以看出,噪声相对于图像本身具有相对较高的频率。因此,应用低通滤波器应该可以解决问题。查看功率谱 abs(fft(...)),以确定截止频率。

不幸的是,低通滤波也会模糊边缘,而中值滤波则不会。 - Jonas
@Jonas:中位数和低通滤波器都会从图像中消除一些细节(在您的情况下,请查看发际线和面部边缘--它们比原始图像更模糊)。 - mpenkov
@misha:是的,它们都会去除细节(例如白线)。由于线条是白色的,边缘会受到一定影响。然而,在低通滤波器中,对边缘的影响比在保边滤波器(如中值滤波器)中更加明显。 - Jonas

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