一种快速图像阈值处理技术
在机器视觉中,阈值处理可能是最基本的一种图像处理。阈值处理需要遍历每一帧的每一个像素以达到检测物体的目的。如果我们能够使这种遍历更加快速,那么CPU将有更多的时间处理其他任务。这篇文章将介绍一种快速阈值处理技术--减少遍历时间的方法。
常规方法:
阈值处理的常规方法中,我们遍历每一个通道的每一个像素值是否处于一定范围内。伪代码如下:
if (redcomponent > somevalue1 &&
redcomponent < somevalue2 &&
greencomponent > somevalue3 &&
greencomponent < somevalue4 &&
bluecomponent > somevalue5 &&
bluecomponent < somevalue6)
{
// Do something (like mark it as white)
}
这种方法的缺陷是:它进行了六次比较----太多了。另一个缺陷是分子太多了,需要处理器经常跳转处理分支。如下图所示,表示的是RGB三通道进行比较的常规方法:
新方法:
之前的方法主要问题是对每一个通道进行了两次比较。但是每一次比较总是固定的数值进行比较。比如,对于红色通道而言,比较范围总是从value1到value2。因此,我们有如下方法:
我们可以创建一个拥有256个元素的数组或查找表。把value1到value2的范围设置为1,其他index的值设置为0,类似的,其他两个通道也是可以这样处理的。如下图所示:
现在,假设需要判断某一个像素的灰度值大小是否在某一范围内,我们可以使用如下伪代码表示:
if(table_red[redcomponent] &&
table_green[greencomponent] &&
table_blue[bluecomonent])
{
// do something
}
假如红色通道的某一像素灰度值在value1到value2之间,table的值将为1,否则为0.类似的,其他两个通道也是这样处理。如果颜色在正确的范围内,判断条件总为真。因此,你可以把相应的像素做任何你想做的事。
很简单不是。典型的空间换时间的方法。在OpenCV中已经使用了这种技术,并利用相应的处理器指令提高阈值处理速度了。其他领域可以借鉴下。
实验结果:
使用常规方和OpenCV所使用的新方法,对比结果如下:
Image size (pixels) | Standard (ms) | Super fast method (ms) |
---|---|---|
73902 | 1.278624 | 0.394651 |
636000 | 5.791450 | 2.213925 |
1555200 | 13.664513 | 5.687084 |
从对比结果可以看出来,新方法将近有300%的的提速。
参考资料:
super fast thresholding technique