c++ - 在二进制 {0, 255} 图像中找到中值时消除分支

标签 c++ c optimization image-processing

我有一个二进制图像,二进制值是0或255。图像数据的类型是unsigned char。这里我需要对这张图片做一个中值滤波。

我认为使用直方图 来查找中位数应该很快。用一些代码来解释:

unsigned int hist[2] = {0, 0};

for (int i = 0; i < kernel_h; ++i) {
     for (int j = 0; j < kernel_w; ++j) {
          if (image(i,j) == 0) {
              hist[0]++;
          }
          else {
              hist[1]++;
          }
     }
}

然后,我们可以非常快速地得到中值。但是由于这种情况,代码还是可以改进的:

int counter = 0;

for (int i = 0; i < kernel_h; ++i) {
     for (int j = 0; j < kernel_w; ++j) {
          if (image(i,j) == 0) {
              counter++
          }
          else {
              counter--;
          }
     }
}

但我想知道是否有其他方法可以消除 if-else 分支,例如使用位操作将 {0, 255} 映射到某个东西,这样我们就可以只更新标志而无需分支。

有人有什么建议吗?

最佳答案

255 的所有位都是 1,因此您可以将“if”简化为:

hist[image(i,j) & 1]++;

如果你想使用计数器你可以这样做:

counter += (image(i,j) & 2)-1;

关于c++ - 在二进制 {0, 255} 图像中找到中值时消除分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19174518/

相关文章:

c - 为什么 Bison 在第一个标记后期待 $end?

c - 段错误 : 1902 vfscanf. c: 没有这样的文件或目录

c - 从优化为循环不变的循环中的结构指针取消引用成员吗?

c++ - 什么是 c printf %f 默认精度?

C++ ARMA方法与回归分析

c++ - 即 bho IDispatchEx::调用失败

c# - 可以使用指针修改只读字段吗?但为什么?

java - 短路与多个 if's

mysql - 优化大表主键搜索

java - Android NDK - 构建未找到 NDK 包含,例如 <Queue>,