图像与Mat

1 数字图像是以像素(pixel)为基本元素的、可以用数字计算机或数字电路存储和处理的图像。通常的二维数字图像是一个矩型,可以用一个二维数组f(x,y)来表示,其中x,y是二维空间中的某坐标系的坐标,f(x,y)表示图像在该点处的灰度值等性质。 2 把白色与黑色之间按对数关系分为若干等级,称为灰度,灰度分为256阶,8位二进制数表示。 3 openCV图像的坐标

彩色图像与灰色图像

Mat类是Opencv中储存图像常见的一种数据结构。Mat类可以看做是存放矩阵的容器,他包含了两部分,分别是用来存放图片信息的信息头,和一个指向图片储存矩阵的指针。

常用成员及含义

1、data: Mat对象中的一个指针,指向存放矩阵数据的内存(uchar* data)

2、dims: 矩阵的维度,3*4的矩阵维度为2维,3*4*5的矩阵维度为3维

3、channels: 矩阵通道,矩阵中的每一个矩阵元素拥有的值的个数,比如 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。

4、depth: 深度,即每一个像素的位数,也就是每个通道的位数。在opencv的Mat.depth()中得到的是一个0 – 6的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 },可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位

Mat的创建和构造: CV_8UC3:8位;U无符号;C3三通道。

方法一: 通过读入一张图像,直接转换为Mat对象 Mat image = imread("test.jpg");

方法二: 使用无参数构造函数,创建Mat对象 Mat image = Mat(); image.create(4, 4, CV_8UC3);

方法三: 使用行、列、类型带这个三个参数的构造函数创建Mat对象 Mat m = Mat(4, 4, CV_8UC3)

方法四: 使用行、列、类型、Scalar向量四个参数的构造函数创建Mat对象 Mat m = Mat(4, 4, CV_8UC3, Scalar(0, 255, 255);

方法五: 使用大小、类型两个参数的构造函数创建Mat对象 Mat m = Mat(Size(4, 4), CV_8UC3);

方法六: 使用大小、类型、Scalar向量三个参数的构造函数创建Mat对象 Mat m = Mat(Size(4, 4), CV_8UC3, Scalar(255, 0, 0));

方法七: 使用Mat::zeros函数实现,两个参数一个是Size表示图像宽与高 另外一个表示类型: Mat m = Mat::zeros(Size(4,4), CV_8UC3);

方法八: 使用Mat::ones函数实现,两个参数一个是Size表示图像宽与高, 另外一个表示类型 Mat m = Mat::ones(Size(4,4), CV_8UC1);

方法九:利用已有矩阵构造 Mat image = imread("test.jpg"); Mat imageNew( image );

方法十:如果需要构造的矩阵尺寸比已有矩阵小,并且存储的是已有矩阵的子内容 cv::Mat::Mat(const Mat & m,  const Range   & rowRange,  const Range & colRange = Range::all()) Mat image = imread("test.jpg"); Mat imageNew( image , Range(1,3),Range(3,6));

图像的ROI区域

1 Rect Mat im1 = im2(Rect(x,y,width,height));

2 Range Mat im1 = im2(Range(rowStart,rowEnd), Range(colStart,colEnd));

Mat浅拷贝: 为了避免拷贝图像的巨大计算量,OpenCV 采用引用计数机制。即每个 Mat 对象有其自己的矩阵头,但可以共享同一个图像矩阵(即 Mat 对象的矩阵指针指向同一地址)。

Mat im = imread("a.jpg");

Mat im1 = im;

Mat im2(im);

Mat深拷贝 需要拷贝矩阵本身,可以用 Mat 的成员函数 clone() 或者 copyTo()。

Mat im1 = imread("a.jpg");

Mat im2 = im1.clone(); //矩阵内容拷贝

Mat im3; im1.copyTo(im3);  //矩阵内容拷贝

Mat的加减乘除 重载了+ , − , ∗, / 运算符的常用功能(注意数据类型和大小)

A±B,A±s,s±A,−A 可进行加减运算

− A  表示取反 α ∗A 可以进行数乘运算  

A /α可以进行数乘运算

cv::Mat A, B, C,D;

C = A + B;  D = A - B;  C = 2 * A; D = B / 2.0;

Mat矩阵的乘法

一、 矩阵乘A*B Mat矩阵A和B被当做纯粹的矩阵做乘法运算,这就要求A的列数等于B的行数时,才能定义两个矩阵相乘。如A是m×n矩阵,B是n×p矩阵,它们的乘积AB是一个m×p矩阵。

二、 点乘A.dot(B) 参与点乘的两个Mat矩阵的数据类型(type)只能是 CV_32F、 CV_64FC1、 CV_32FC2、 CV_64FC2 这4种类型中的一种。

三、 计算两个Mat矩阵对应位的乘积A.mul(B) 要求参与运算的矩阵A的行列和B的行列数一致。计算结果是跟A或B行列数一致的一个Mat矩阵。 mul说明: 1、mul操作不对参与运算的两个矩阵A、B有数据类型上的要求,但要求A,B类型一致,不然报错; 2、Mat AB=A.mul(B),若声明AB时没有定义AB的数据类型,则默认AB的数据类型跟A和B保存一致; 3、若AB精度不够,可能产生溢出,溢出的值被置为当前精度下的最大值;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值