我正在编写一个图像二值化算法,它只是将每个像素的亮度值(灰度图像)转换为黑色或白色。目前,用于二值化每个像素的算法大致是这个
if( grayscale[x] < thresholdValue)
{
bitonal[x] = 1;
}
(这实际上是ACTUAL算法的简化,因为双色调图像实际上是一个bitpacked图像(每个数组索引保持8个像素)所以我实际上在当前数组索引中对1进行bitpack ...但我不认为这改变了我的问题。
我正在尝试做的是删除对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)
的另一种方式,也可以工作......只要我可以摆脱分支语句...任何帮助赞赏..
答案 0 :(得分:8)
bitonal[x] = (grayscale[x] < thresholdValue);
答案 1 :(得分:4)
如果亮度为8位值,那么您可以拥有256个元素的数组,其中包含0或1(数组的第一个阈值元素包含1
,以及其余元素包含0
。
bitonal[x] = array[grayscale[x]];
答案 2 :(得分: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);
如果&lt; max
,min
的结果将仅为非零。湾然后{{1}}会将任何非零值转换为1。
这是特定于处理器的,可能根本不适用于X86。
答案 3 :(得分:0)
您使用的是哪种语言?该语言是否具有最小/最大功能? (例如C ++和Java都这样做)如果语言有,那将是一种消除if的方法......例如Min(灰度[x]&lt; thresholdValue,0)
答案 4 :(得分:0)
也许:
bitonal[x] = ((grayscale[x] - thresholdValue) >> 31) xor 1;
假设您的语言不等于布尔值和整数值(如C和C ++那样)。