本文作者:小嗷
微信号:aoxiaoji
简书链接:https://www.jianshu.com/u/45da1fbce7d0
关键词:颜色空间缩减和计时函数【两个简便的计时函数—getTickCount()和getTickFrequency()】
计时函数用途:计算耗时工作
颜色空间缩减用途:颜色空间缩减。(公式如下)
如何遍历图像中的每一个像素点? 请看第8篇代码【更正曝光不足的图像(图像的对比度和亮度及轨迹条)】
OpenCv的矩阵值是如何存储的? 请看第9篇恶心的内容【基本的图像容器(Mat详解)】
如何测试我们所实现算法的性能?通过算法耗时和效果的对比【计时函数】
查找表是什么?为什么要用它?等一下,会说到。
图像矩阵的大小取决于我们使用的颜色模型,确切的说,取决于所用通道数。如果是灰度图像,矩阵就会像这样:
而对于多通道图像来说,矩阵中的列会包含多个子列,其子列个数与通道数相等,例如,RGB颜色模型的矩阵:
在这里,我们需要注意的是:子列的通道顺序是反过来的,是BGR,而不是我们数字图像书中常说的RGB.很多情况下,因为内存够大,可以实现连续存储。连续存储可以提高图像的扫描速度。我们可以使用isContinuous来判断矩阵是否连续矩阵。
3.1 颜色空间的缩减
如果矩阵元素存储的是单通道像素,使用C或C++的无符号字符类型,那么像素可能有256个不同的值.但若是三通道图像,这种存储格式的颜色数就太多了(确切的说,有一千六百多万种).用如此之多的颜色 可能会对我们算法的性能造成严重的影响。其实,有时候,我们仅适用这些颜色的一小部分,就足以达到同样的效果。
这种情况下,常用的一种方法就是【颜色空间缩减】.其做法是:将现有颜色值除以某个输入值,以获得较少的颜色数。例如:0到9可取新值0;10到19取值1,以此类推。
uchar(无符号字符,即0到255之间取值的数)类型除以int值,结果仍为char。因为结果是char类型的, 所以,求出来小数也要向下取整。利用这一点,刚才提到在uchar定义域中进行颜色缩减运算就可以表达为下列形式:
Inew=Iold/10*10;
这样的话,简单的颜色缩减算法就可以由以下两步组成:
1--遍历图像矩阵中的每一个像素 (第8篇用过)
2--对像素应用上述公式
值得注意的是,我们这里用到了除法和乘法运算,而这种运算又特别费时,所以,我们应尽可能用代价较低的加减,赋值等运算替换他们。
3.2 计时函数
OpenCv为我们提供了两个简单的计时函数---getTickCount()和getTickFrequency()
getTickCount()函数---返回CPU自某个事件以来走过的----时钟周期数
getTickFrequency()函数返回CUP一秒钟所走的时钟周期数。这样,我们就可以轻松的以秒为单位对某运算计时
这两个函数组合起来的使用如下所示:
我一般都是复制粘贴计时函数,哈哈哈
3.3 访问图像中像素的三类方法
任何图像处理算法。都是从操作每个像素开始的。即使我们不会使用OpenCv提供的各种图像处理函数,只要我们了解图像处理算法的基本原理,也可以写出具有相同功能的程序.在OpenCv中,提供了三种访问每个像素的方法:
效果图
注意:第八种方法最快,利用 .ptr 和 * ++ 以及位运算 (continuous+channels)的方法所用时间为1.08502ms(以后就用第八种【以后复制粘贴第八种】,哈哈哈)
领取专属 10元无门槛券
私享最新 技术干货