我想知道是否有一种简单的方法来平滑图像,例如使用高斯内核而不引入使用离散傅立叶变换时也存在的边界效应?对于这两种方法,左侧的缺失像素将从右侧获取,反之亦然。
现在我有一个 5x5 高斯内核,我在我的 MxN 图像上迭代移动。到目前为止,如果我到达图像的最后一个像素,操作员会自动使用第一个像素,依此类推。由于我的图片不是周期性的,即使我用相应的相邻列或行的强度值填充我的图片,我也会得到伪影。
大家有什么建议吗?
谢谢!
我想知道是否有一种简单的方法来平滑图像,例如使用高斯内核而不引入使用离散傅立叶变换时也存在的边界效应?对于这两种方法,左侧的缺失像素将从右侧获取,反之亦然。
现在我有一个 5x5 高斯内核,我在我的 MxN 图像上迭代移动。到目前为止,如果我到达图像的最后一个像素,操作员会自动使用第一个像素,依此类推。由于我的图片不是周期性的,即使我用相应的相邻列或行的强度值填充我的图片,我也会得到伪影。
大家有什么建议吗?
谢谢!
焊盘图像和平滑:

使值 1 的图像与原始大小相同。垫和光滑:

将原始图像除以“1”图像:

和作物:

MATLAB 演示代码:
I = double(imread('lena.tif'));
g = fspecial('gaussian',60,10);
Ipad = padarray(I,[10,10]);
imagesc(Ipad); colormap gray(256); pause;
Ipadg = imfilter(Ipad,g);
imagesc(Ipadg); colormap gray(256); pause;
A = ones(size(I));
Apad = padarray(A,[10,10]);
imagesc(Apad); colormap gray(256); pause;
Apadg = imfilter(Apad,g);
imagesc(Apadg); colormap gray(256); pause;
IA = Ipadg./Apadg;
imagesc(IA); colormap gray(256); pause;
I = IA(11:end-10,11:end-10);
imagesc(I); colormap gray(256); pause;
*注意:* MATLABimfilter已经进行了零填充。不需要焊盘阵列步骤,仅用于演示。实际代码是:
I = double(imread('lena.tif'));
g = fspecial('gaussian',60,10);
Ig = imfilter(I,g);
A = ones(size(I));
Ag = imfilter(A,g);;
Ismooth = Ig./Ag;
好吧,填充主要是唯一的选择。但是,您可以做的是在接近边界时缩小高斯核的大小。使用这种调整内核的自适应方式,当您接近边界时,您将失去平滑度,但这可以为您提供您在平滑方面所需要的东西。至少它没有引入无意义的边界条件。当然,您可以达到的最小内核大小是 3,因此您将拥有 1 列/行的垃圾值(您也可以通过填充来解决这个问题)。
如果你想变得更疯狂,我会建议以下几点:
将您的图像复制到一个填充的图像中并修复外部边界。使用 PatchMatch(http://gfx.cs.princeton.edu/pubs/Barnes_2009_PAR/index.php)等示例方法来完成。这样,您将使用合理的值修复您的图像,然后您可以应用标准的高斯卷积。