我有一个二进制图像,二进制值是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/