4

我正在编写一个图像二值化算法,它只是将每个像素的亮度值(灰度图像)转换为黑色或白色。目前对每个像素进行二值化的算法大致是这样的

if( grayscale[x] < thresholdValue)
{
bitonal[x] = 1;
}

(这实际上是 ACTUAL 算法的简化,因为双色调图像实际上是一个位压缩图像(每个数组索引包含 8 个像素)所以我实际上将 1 位压缩到当前数组索引中......但我不认为这会改变我的问题。

我正在尝试做的是消除对 if 语句的需要。

我的想法是按照这个思路做一些事情。用灰度减去 thresholdValue,然后执行一些位操作技巧来清除或移位位,这样如果(grayscale[x]-threshold) is less than 0, I get a 0. otherwise I would get a 1. 如果以另一种方式更容易做到这(if grayscale[x]-threshold < 0 + bitwise trickery get a 1, else get a 0)一点也可以工作......只要我可以摆脱分支语句......任何帮助表示赞赏..

4

5 回答 5

8

bitonal[x] = (grayscale[x] < thresholdValue);

于 2010-02-24T21:43:32.623 回答
4

如果亮度是一个 8 位值,那么您可以拥有一个包含 0 或 1 的 256 个元素的数组(数组的第一个阈值元素包含1,其余元素包含0.

bitonal[x] = array[grayscale[x]];
于 2010-02-24T21:51:04.207 回答
4

我一直在为我的嵌入式应用程序中的时间关键循环寻找类似的东西。我发现的一件有趣的事情是这样的代码

bit = (a<b);

仍然在我的平台上生成分支指令(TI F2812)。似乎编译器没有直接的方法将状态标志从比较移动到寄存器中,所以它会生成类似的东西

 temp_register =  0
 cmp a,b
 branch to label if LT
 temp_register = 1
label:
 bit = temp_register

但是,处理器确实具有内置的 max 和 min 运算符。由于分支非常昂贵,因此此代码实际上运行得更快:

bit = min(max((b-a),0),1);

只有当 a < b 时,结果max才会非零。然后min将任何非零转换为1。

这是非常特定于处理器的,可能根本不适用于 X86。

于 2010-03-02T00:32:48.867 回答
0

你用什么语言工作?该语言是否具有最小/最大功能?(例如 C++ 和 Java 都可以)如果语言可以,那将是消除 if...eg Min(grayscale[x] < thresholdValue, 0) 的一种方法

于 2010-02-24T21:43:47.330 回答
0

也许:

bitonal[x] = ((grayscale[x] - thresholdValue) >> 31) xor 1;

假设您的语言不等同于布尔值和整数值(就像 C 和 C++ 那样)。

于 2010-02-24T21:46:50.697 回答