c++ - 过滤 1bpp 图像

标签 c++ image-processing performance

我希望使用 3x3 过滤器过滤每像素 1 位的图像:对于每个输入像素,如果其周围像素的加权和(权重由过滤器确定),则相应的输出像素设置为 1超过某个阈值。

我希望这比转换为 8 bpp 然后进行过滤更有效,但我想不出一个好的方法来做到这一点。一种简单的方法是跟踪九个指向字节的指针(三个连续行以及指向每行中当前字节任一侧的指针,用于计算这些字节中的第一位和最后一位的输出)以及每个输入像素的计算

sum = 过滤器[0] * (lastRowPtr & aMask > 0) + 过滤器[1] * (lastRowPtr & bMask > 0) + ... + 过滤器[8] * (nextRowPtr & hMask > 0)

对于字节边缘的位有额外的 faff。然而,这很慢而且看起来真的很难看。每个字节有八个像素,您并没有获得任何并行性,而是必须做大量额外的工作来屏蔽事物。

是否有任何好的资源可以帮助您最好地完成此类事情?这个特定问题的解决方案将是令人惊奇的,但我很高兴有人指出在 C/C++ 中对 1bpp 图像进行高效图像处理的任何示例。我希望将来用 1 bpp 算法替换更多 8 bpp 的东西,以避免图像转换和复制,因此任何有关这方面的通用资源将不胜感激。

最佳答案

几年前,我发现将位解压缩为字节,进行过滤,然后将字节打包回位比直接处理位要快。这似乎违反直觉,因为它是 3 个循环而不是 1 个,但每个循环的简单性足以弥补这一点。

我不能保证它仍然是最快的;编译器,尤其是处理器很容易发生变化。然而,简化每个循环不仅可以更容易优化,还可以更容易阅读。这一定是有值(value)的。

解包到单独缓冲区的另一个优点是,它为您在边缘执行的操作提供了灵活性。通过使缓冲区比输入大 2 个字节,您可以从字节 1 开始解包,然后将字节 0 和 n 设置为您喜欢的任何内容,并且过滤循环根本不必担心边界条件。

关于c++ - 过滤 1bpp 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11146029/

相关文章:

c# - 我应该使用什么来代替 OnMouseXXX 事件处理程序?

javascript - 使用 JavaScript 测量页面加载时间

c++ - 基于 CMake 平台的 Clang

c++ - 全局列出对象并在 c/c++ 中添加类的本地对象

c++ - 如何防止模板类的实例化?

image-processing - 滤镜在图像处理中如何工作?

performance - 巴比伦方法的时间复杂度

c++ - CreateRemoteThread() 成功但不执行任何操作

matlab - 使用图像处理识别皮肤病

python - Scipy Cookbook 中 RANSAC 实现的不一致