图像二值化
最简单的就是for{if{}}的方式(方式一)。
//简单但不高效的方式
void SimpleBin(Mat &src, Mat &dst, int thresh, int minVal, int maxVal)
{
uchar* srcData = src.data;
uchar* dstData = dst.data;
int dataLength = src.cols*src.rows*src.channels();
for (int i = 0; i < dataLength; i++)
{
dstData[i] = (srcData[i] >= thresh) ? maxVal : minVal;
}
}
看了下OpenCV的源码通过对cmake的OpenCV3.1进行调试跟踪,在不断地【F10】->【F11】->【Shift+F11】->...之后找到核心地带。
其中有很多预编译宏的加速方法,将其中不加速的部分提取出来,做简单的删改如下,(方式二)
// 提取OpenCV中threshold中的关键内容,稍作删改而成
void SimpleThreshold(Mat &src, Mat &dst, int thresh, int minval, int maxval)
{
int i, j;
uchar tab[256];
//int src_channels = src.channels();
//int dst_channels = dst.channels();
int dataLength = src.cols*src.rows*src.channels();
uchar* srcData = src.data;
uchar* dstData = dst.data;
// ...
for (i = 0; i <= thresh; i++)
tab[i] = minval;
for (; i < 256; i++)
tab[i] = maxval;
// ...
for (i = 0; i < dataLength; i ++)
{
dstData[i] = tab[srcData[i]];
}
}
将OpenCV自带的threshold函数作为(方式三),三者进行测试,图片为3x1912x1000的rgb图像。处理结果完全相同,循环运行十次的耗时如下,纵轴单位为ms
OpenCV自带函数第一次调用系统的优化方式时比较耗时较长,之后再次调用则耗时极短。
根据OpenCV纯cpu优化后的方式比原始的for-if方式十次内平均提速49%,算法的力量强大。