我希望使用 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/