学习
实践
活动
专区
工具
TVP
写文章

10.马赛克原理之简单提高图像算法性能-OpenCV从零开始到图像识别系列

本文作者:小嗷

微信号: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(以后就用第八种【以后复制粘贴第八种】,哈哈哈)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180524G0AQ2D00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券