opencv源码--高效的二值化函数

图像二值化

最简单的就是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%,算法的力量强大。

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值