Opencv核心功能---使用OpenCV扫描图像,查找表和时间测量

测试样例

通过使用无符号字符C和C ++类型进行矩阵项存储,像素通道可以具有多达256个不同的值。 对于三通道图像,这可以允许形成太多颜色(确切地说是1600万)。 使用如此多的色调可能会严重影响我们的算法性能。 

在这种情况下,我们通常会减少色彩空间。 这意味着我们将颜色空间当前值除以新的输入值,最终得到更少的颜色。 例如,0到9之间的每个值都取新零值,每个值在10到19之间,值为10,依此类推。

当您将uchar(unsigned char - 也就是0到255之间的值)值除以int值时,结果也将是char。 这些值可能只是char值。 因此,任何分数都将向下舍入。 利用这一事实,uchar域中的上层操作可表示为:

因此,对于较大的图像,最好事先计算所有可能的值,并在分配期间通过使用查找表进行分配。 查找表是简单数组(具有一个或多个维度),对于给定的输入值变量,它保存最终输出值。 它的优势在于我们不需要进行计算,我们只需要读取结果。

我们的测试用例程序将执行以下操作:读取控制台行参数图像(可能是颜色或灰度 - 控制台行参数)并使用给定的控制台行参数整数值应用缩减。 在OpenCV中,目前可以有三种遍历图像的方式。 为了使事情更有趣,将使用所有这些方法扫描每个图像,并打印出它花了多长时间。

下列示例的源代码下载网址:https://github.com/opencv/opencv/blob/master/samples/cpp/tutorial_code/core/how_to_scan_images/how_to_scan_images.cpp

控制台的操作方式:

最后一个参数是可选的。 如果给定图像将以灰度格式加载,否则使用BGR颜色空间。 首先是计算查找表:

这里我们首先使用C ++ stringstream类将第三个命令行参数从文本转换为整数格式。 然后我们使用简单的外观和上面的公式来计算查找表。

OpenCV提供了两个简单的函数来实现这个cv :: getTickCount()和cv :: getTickFrequency()。 第一个返回特定事件(例如,自启动系统以来)系统CPU的滴答数。 第二个返回CPU在一秒钟内发出滴答的次数。 因此,要以秒为单位测量两次操作之间经过的时间很容易:

图片的矩阵在内存中如何存储

矩阵的大小取决于所使用的颜色系统。 更准确地说,它取决于使用的通道数量。 在灰度图像的情况下,我们采用下列方式:

对于多通道图像,列包含与通道数一样多的子列。 例如,在BGR颜色系统的情况下:

请注意,通道的顺序是反向的:BGR而不是RGB。 因为在许多情况下,内存足够大以便以连续方式存储行,所以行可以一个接一个地跟随,从而创建单个长行。 因为一切都在一个接一个的地方,这可能有助于加快扫描过程。 我们可以使用cv :: Mat :: isContinuous()函数来询问矩阵是否是这种情况。 

访问像素最高效的方式

我们建议的最有效的方法是:

在这里,我们基本上只获取指向每行开头的指针,然后直到它结束。 在矩阵以连续方式存储的特殊情况下,我们只需要一次请求指针并一直到最后。 我们需要注意彩色图像:我们有三个通道,所以我们需要在每行中传递三倍以上的项目。

 Mat对象的数据成员返回指向第一行第一列的指针。 如果此指针为null,则表示该对象中没有有效输入。 检查这是检查图像加载是否成功的最简单方法。 如果存储成功,我们可以使用它来遍历整个数据指针。 如果是灰度图像,这将看起来像:

访问像素最安全的访问方式

迭代器方法被认为是一种更安全的方式,因为它从用户接管这些任务。 您需要做的就是询问图像矩阵的开始和结束,然后只需增加开始迭代器直到结束。 要获取迭代器指向的值,请使用*运算符(在它之前添加它)。

在彩色图像的情况下,我们每列有三个uchar条目。 这可以被认为是uchar项目的简短向量,已经在OpenCV中使用Vec3b名称进行了修饰。 要访问第n个子列,我们使用简单的operator []访问。 重要的是要记住OpenCV迭代器遍历列并自动跳到下一行。 因此,如果使用简单的uchar迭代器,在彩色图像的情况下,您将只能访问蓝色通道值。

通过动态地址计算来访问图片

建议不要使用最终方法进行扫描。 它是为了获取或修改图像中的某些随机元素。 其基本用法是指定要访问的项目的行号和列号。

这些函数采用您的输入类型和坐标,并即时计算查询项的地址。 然后返回对它的引用。 当您获得值时,这可能是常量,而在设置值时,这可能是非常数。

如果您需要使用此方法对图像进行多次查找,则为每个访问输入类型和at关键字可能会很麻烦且耗时。 为了解决这个问题,OpenCV有一个cv :: Mat_数据类型。 它与Mat相同,需要在定义时通过查看数据矩阵来指定数据类型,您可以使用operator()来快速访问条目。 

核心函数

这是在图像中实现查找表修改的激励方法。 因为在图像处理中,您希望将所有给定图像值替换为其他值,该操作可以在不需要您编写图像扫描的情况下进行修改。 我们使用核心模块的cv :: LUT()函数。 首先,我们构建一个Mat类型的查找表:

最后调用函数(I是我们的输入图像,J是输出图像):

运行差异比较

最快的方法是LUT功能。 这是因为OpenCV库是通过Intel Threaded Building Blocks实现多线程的。 但是,如果需要编写简单的图像扫描,则更喜欢指针方法。 迭代器是一个更安全的方式,但速度相当慢。 在调试模式下,使用动态参考访问方法进行全图扫描是最昂贵的。 在发行模式下,它可能会超越迭代器方法,但它肯定会牺牲迭代器的安全特性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与国已互相成为双方最大的交易伙伴。国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占国外贸总值的15.4%。在过去20余年,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值