赞
踩
图像二值化
最简单的就是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%,算法的力量强大。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。