我有一个二进制图像,二进制值是 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]++;
}
}
}
然后,我们可以非常快地得到中值。但是由于这种情况,代码仍有待改进:</p>
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} 映射到某个东西,这样我们就可以在不分支的情况下更新标志。
有人有什么建议吗?