对图像进行离散卷积,结果大于255时,如何处理像素强度溢出?

信息处理 图像处理
2022-01-27 10:41:05

这是我在这个论坛上的第一篇文章,我一直在努力为我的硬件设计课的最终项目提出一个解决方案,在 Altera Cyclone FPGA 上使用系统 verilog。在将 3x3 像素强度矩阵(RGB,值从 0-255)与特定内核(模糊、精明边缘检测、浮雕等)卷积时,我一直无法找到溢出的解决方案

我的问题是:我应该如何处理大于 255 的结果?我已经看到一些参考建议将值从 255“环绕”回 0 及以上,并且还看到一些参考建议将所有像素乘以“缩小因子”(例如 .8)以避免不得不处理像素强度溢出。

可悲的是,我发现很少有参考资料解释如何在硬件实现中处理这个问题。我在这里错过了什么吗?任何帮助将不胜感激。

编辑:

具体来说,如果你卷积一个矩阵

[255, 255, 255; 255 255 255; 255, 255, 255] * [1, 1, 1; 1, 1, 1; 1, 1, 1]

? 您的结果不会包含超出 0-255 范围的值吗?

2个回答

您面临的问题没有完美的解决方案。你必须做出选择,每一个选择都有利有弊。例如,您可以应用饱和阈值。或者您可以使用标准化。如果中间处理阶段不会将强度放大太多超过 255(或低于 0),则饱和阈值裁剪非常容易实现并提供出色的性能。否则会严重扭曲图像。归一化保证了无损失的输出,但可能会严重降低算法质量。此外,它需要您提前知道标准化规模,这可能并不总是可能的。

不幸的是,我对硬件不太熟悉,所以我无法提供比这更明智的答案。我认为标准化将是最直接的解决方案,因为您可以将所有值除以 255(已知的最大值),执行操作,找到新的最大值,然后再按比例放大,使最大值再次变为 255。我认为,这应该适用于您想要执行的任何操作,只要您可以保持所需的平坦点精度,不会丢失有关原始信号的任何信息。

当然,如果你事先知道需要应用什么样的操作,那么你可以做其他事情。例如,如果您知道您的值不会非常大,您可以乘以 0.8 之类的常数(如您所建议的)。或者,如果您正在执行卷积,您可以在卷积之前缩小内核。