OpenCVForUnity(四)如何使用OpenCV图像处理机制

文章探讨了OpenCV如何有效地处理大量像素数据,通过色彩空间压缩和使用加减法优化处理速度。图像在内存中以连续结构存储,尤其是BGR通道顺序。推荐使用指针访问和LUT(查找表)功能以提高效率,其中LUT方法由于多线程支持展现出最佳性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

这节课我们来了解一下OpenCV是如何处理如此庞大的像素点集群的。


如何扫秒通道的每个像素

每个像素点中,最多可以也有256个不同的值.而每个像素可以有四个通道,这意味着每个像素点可以形成1684万的颜色.这对性能无疑是沉重的打击.然而可以OpenCV使用了优化的方式,使其减少工作量以达到相同的效果.

通常会通过减少色彩空间,如0 ~ 9 则取0,10 ~ 19则取10. 向下舍入.每个值都在十到十之间。当用使用Int值将uCher值分隔时结果将会是char。因此任何分数也将是向下啥入,表达为公式为:
在这里插入图片描述

简单的空间缩小算法可以用过矩阵公式来实现,如使用乘法除法对性能的消耗更大,因而OpenCV会优先使用加减法,且值的上限为256.
为了提升处理速度 ,对于较大的图像可能通过预先计算的方式并使用表记录查找的方式分配。


图像如何储存在内存中?

图像矩阵的大小取决于颜色系统和通道数量,在灰度的情况他像这样:
在这里插入图片描述
对于多通道列包含与通道数一样多的子列。例如是BGR颜色系统下情况则是这样:
在这里插入图片描述
值得注意的是在openCV中通道顺序是 **BGR**而不是 RGB.
通常内存是足够大的而且是连续结构这样有助于更快的读写扫描.


访问方式

最有效的方法是使用指针, 在处理矩阵时,我们需要获取指向每一行开头的指针,并遍历每一项。对于彩色图像,由于有三个通道,我们需要遍历每行三次以上。Mat对象的数据成员返回指向第一个元素的指针,如果为空,则说明图像未加载成功。在灰度图像的情况下,遍历是连续的。

性能差异

为了对比出更好效果,我们运行程序并对比出差异。为了便差异更加清晰,我们使用2560 X 1600 的图像。这里呈现的性能是彩色图像。为了更准确的值我们的数据为调用100次后的平均值。

方法时间
高效的方式79.4717毫秒
迭代程序83.7201毫秒
在飞行RA93.7878毫秒
LUT功能32.5759毫秒

通过上表我们可以总结出一些内容。如果可以,尽可能使用OpenCV现有的方法,效率会比较高. 可以看出最忆的方式是使用LUT功能。这是因为OpenCV库通过Intel Threaded Building Blocks启用多线程。

但是如果你需要编写一个简单的图片扫描可以考虑使用指针的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小盖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值