靠近图像边界的高斯滤波器

信息处理 图像处理 卷积 高斯
2022-01-18 20:38:34

当在图像边界附近应用高斯滤波器时,算法通常零填充或复制/镜像/环绕边界。这对我的情况来说还不够好,所以我想知道那里是否有更好的东西。

由于平滑的想法是吸收周围点的信息,我想知道在边界情况下使用不同的内核是否有意义。这个内核只会从可用的周围点获取值,例如,如果我的内核是这样的:

[0.01130.08380.01130.08380.61930.08380.01130.08380.0113]

要计算上边距上的像素(但不靠近角落),我会使用

[0.09380.69330.09380.01260.09380.0126]

后一个矩阵是通过裁剪掉图像之外的内核部分(顶行)并重新归一化来计算的。这种方法或替代方法有问题吗?

这里有一些代码可以更好地解释我的想法:

kernel = [0.0113 0.0838 0.0113; 0.0838 0.6193 0.0838; 0.0113 0.0838 0.0113]
kernel2 = [0.0938 0.6933 0.0938; 0.0126 0.0938 0.0126];
M = [1 2 3; 4 5 6]; % my image

% application of kernel to point 2 in M would provide the value:
res1 = sum(sum( kernel(2:3,:).*M )); % 0 padding, equals 2.1058
res2 = sum(sum( kernel.*[1 2 3; M] )); % row replication, equals 2.3186

% application of kernel2 to the same point:
res3 = sum(sum( kernel2 .* M )); % equals 2.3568

请注意,在使用时kernel2我不会推断一行[0 0 0]or [1 2 3],这会低估这一点。

2个回答

必须外推图像边界之外的像素。
现在,您需要选择外推模型。

例如,如果您在离散傅里叶模型中工作,则定期外推是本机选择。
通常最“眼睛友好”的解决方案是基于“最近邻居”的复制。

您的选择与任何选择一样有效,您只需要确定它满足哪个模型以及该模型是否适合您。

然而,它有一个明显的警告,它使你的内核空间变体,这意味着,如果没有精心处理,它会损害性能。
正确的做法是隔离由于边界条件而应仔细处理的像素,并在其余部分上非常有效地工作。

Tim Holy 在视频图像表示和分析(转至 42:30)中谈到了它。

我不太喜欢裁剪内核并对其进行重新归一化的想法,因为它会人为地强调不需要的像素(权重随着归一化常数的比率而全局增加)。

我更喜欢用具有“物理健全性”的规则来推断这些值并应用完整的内核。如果外推规则是线性的,您确实可以重新计算包含内插规则的内核。

举一个简单的例子,假设二项式内核142414超过像素 ab c。

如果像素 a 缺失,

  • 裁剪和重新规范化给出2313

  • 通过像素复制的简单外推(假设丢失的像素为 b)等价于3414

  • 镜像(假定为 c)给出2424

  • 线性外推(假设为 2b-c)给出4404