我扫描了一张带有纸质纹理的老照片,想尽可能地去除纹理而不降低图像质量。是否有一种方法,可能使用MATLAB中的图像处理工具箱?我已经尝试应用FFT变换(使用Photoshop插件),但我找不到任何清晰的白点来涂抹。也许这种方法对于该模式不是很规则?您可以在下面看到样本。如果需要完整的图像,我可以上传到某个地方。
![photograph sample](https://istack.dev59.com/JzJMS.webp)
不幸的是,这种图案并不是足够重复的,所以傅里叶分析并不适用于这种情况,你只能固守于空间领域。
正如 @Jonas 和 @michid 所指出的,滤波可以帮助你解决这样的问题。在滤波过程中,你需要权衡要保留的细节和要消除的噪声(或不需要的图像组件)之间的关系。例如,@Jonas 使用的中值滤波器可以完全消除纸张纹理(甚至是图像底部附近的圆形划痕),但同时也会消除眼睛、头发、面部和背景中的所有纹理(虽然我们并不太关心背景,但前景很重要)。此外,你还会看到图像对比度略微降低,这通常是不可取的,它会使图像看起来不自然。
以下是我处理这个问题的方法:
纸张纹理图案(阈值化之前):
你希望在上面的图像中尽可能少地包含实际的图像信息。你会发现你可以非常微弱地看到脸的边缘(这不太好,但这是我能做的最好的了)。你还希望这个纸张纹理图像尽可能均匀(以便在整个图像上进行阈值处理时得到相等的结果)。再次强调,上面的图像右侧略微偏暗,这意味着对它进行良好的阈值处理将会很困难。
最终图片:
结果并不完美,但它已经完全消除了明显的纸张纹理,并保留了比简单滤波方法更多的高频内容。
编辑
填充区域通常是纯色的,因此如果您仔细观察图像,它们会稍微显眼。您还可以尝试在填充区域添加一些低强度零均值高斯噪声,使它们看起来更真实。您需要选择与背景匹配的噪声方差。经验上确定可能已经足够。
这是加入噪声的处理后的图像:
请注意,去除纸张纹理的部分更难以看到,因为添加的高斯噪声掩盖了它们。我对整个图像使用了相同的高斯分布,但如果您想更加复杂,可以为脸部、背景等使用不同的分布。
中值滤波可以稍微帮助一下:
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,[])
请注意,您可能希望首先填充图像,以避免边缘效应。
编辑:比[15 15]
小的滤波器核将更好地保留图像纹理,但会留下更多可见的滤波痕迹。
abs(fft(...))
,以确定截止频率。