OpenCV 核心--Mat基本图像容器

目的

真实世界中所有的图片,在计算机中都可以理解为一个矩阵,包含了图像中所有像素点的强度值。OpenCV其主要目的就是通过处理和操作这些信息,来获取更高级的信息。

Mat

Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。
矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。当程序中传递图像并创建拷贝时,大的开销是由矩阵造成,而不是信息头。所有OpenCV采用引用计数,来避免不必要的拷贝,提高程序速度。
OpenCV引用计数的基本思路是,让每个Mat对象 都有自己的信息头,但共享一个矩阵,通过指针指向同一地址实现,拷贝构造函数则只拷贝信息头与矩阵指针。

Mat A,C;                                     //只创建信息头
A = imread(argv[1],CV_LOAD_IMAGE_COLOR);     //为矩阵开辟内存

Mat B(A);                                    //使用拷贝构造函数
C = A;                                       // 赋值运算符

以上 A,B, C最终会指向同一个数据矩阵,任何一个对象对矩阵做出改变都会影响其他对象的矩阵,这个矩阵将由最后一个使用者清理,即计数为0时,矩阵会被清理。

若想拷贝矩阵,如下

Mat F = A.clone();
Mat G;
A.copyTo(G);

注:
OpenCV输出图像的内存分配时自动完成的(如果不特别指定) * 使用OpenCV的C++接口时不需要考虑内存释放问题 * 赋值运算符与操作符只拷贝信息头 * 使用clone()或则copyTo来拷贝一幅图像的矩阵

存储方法

颜色空间是指对一个给定的颜色,如何组合颜色元素以对其编码。最简单的颜色空间要属灰度级空间,只处理黑色和白色,对它们进行组合可以产生不同程度的灰色。

RGB颜色空间是最常用的一种颜色空间,这归功于它也是人眼内部构成颜色的方式。它的基色是红色、绿色和蓝色,有时为了表示透明颜色也会加入第四个元素alpha(A)

有很多的颜色系统,各有自身优势:
  • RGB是最常用的,这是因为人眼采用相似的工作机制,它也被显示设备所采用。

  • HSV和HLS把颜色分解成色调(Hue)、饱和度(Saturation)和亮度(Lightness)/明度(Value)。这是描述颜色更自然的方式,比如可以通过抛弃最后一个元素,使算法对输入图像的光照条件不敏感。

  • YCrCb在JPEG图像格式中广泛使用。

  • CIE Lab*是一种在感知上均匀的颜色空间,它适合用来度量两个颜色之间的距离。

每个组成元素都有其自己的定义域,取决于其数据类型。如何存储一个元素决定了我们在其定义域上能够控制的精度。最小的数据类型是char,只有一个字节或8位,可以是有符号型(0255)或无符号型(-127127)。尽管使用三个char型元素已经可以表示1600万种可能的颜色(使用RGB颜色空间),但若使用float(4字节,32位)或double(8字节,64位)则能给出更加精细的颜色分辨能力。但同时会增加图像所占内存空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值