【发布时间】:2012-06-21 20:14:15
【问题描述】:
我希望使用 3x3 过滤器过滤每像素 1 位的图像:对于每个输入像素,如果周围像素的加权和(权重由过滤器确定),则相应的输出像素设置为 1超过某个阈值。
我希望这比转换为 8 bpp 然后过滤它更有效,但我想不出一个好方法来做到这一点。一种简单的方法是跟踪指向字节的九个指针(三个连续的行以及指向每行中当前字节任一侧的指针,用于计算这些字节中第一个和最后一个位的输出)和每个输入像素计算
sum = filter[0] * (lastRowPtr & aMask > 0) + filter[1] * (lastRowPtr & bMask > 0) + ... + filter[8] * (nextRowPtr & hMask > 0),
为字节边缘的位添加额外的 faff。但是,这很慢,而且看起来真的很难看。每个字节有 8 个像素这一事实并没有使您获得任何并行性,而是不得不做大量额外的工作来屏蔽事物。
对于如何最好地完成此类事情,有什么好的资源吗?这个特定问题的解决方案将是惊人的,但我很高兴有人指出任何在 C/C++ 中对 1bpp 图像进行高效图像处理的示例。我想在将来用 1 bpp 算法替换更多 8 bpp 的东西,以避免图像转换和复制,所以任何关于这方面的一般资源将不胜感激。
【问题讨论】:
-
您的图像宽度是 8 的倍数,还是填充行以使每行都从字节边界开始?这通常是这种情况,它使事情变得更容易一些。你只需要 3 个口罩而不是 9 个。
-
图像宽度是任意的,但每一行都从一个字节边界开始。行可以填充到更大的边界,但保证填充到字节。
-
边缘的填充方法是什么?重复还是钳制?
-
我不太担心最外层像素环会发生什么。任何明智的事情都可以。
-
不,我的意思是逻辑上,在你的卷积期间。什么是必需的行为?超出边缘的像素是否等于边缘的最后一个像素?还是该行/列另一侧的第一个像素?
标签: c++ image-processing performance