【速览OpenCV】用图片拼接实例熟悉CV矩阵操作(1)

用图片拼接实例熟悉CV图像(矩阵)操作(1)

我们的目标是:使用代码把两张图片拼接在一起
本节内容A:OpenCV视角下的图片
本节内容B:OpenCV处理图像的Class

图片数据容器

OpenCV习惯将图片数据加载到类cv::Mat中,通过Mat的member Function或者以Mat为处理对象的算法进行图像处理。如上图所示,模板类Mat支持多种数据类型。
在这里插入图片描述

OpenCV的官方文档中给出了Mat的member Functions和其参数表的说明,详情可访问:https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html


据文档描述,Mat是一种支持复数处理的多维矩阵,可以用各种标准的数据结构——譬如vector来初始化一个Mat。
在这里插入图片描述
总而言之,有了Mat,就可以忽略各中图片文件格式,可以直接用类似于下列的方法把图片数据加载到Mat中进行处理,十分方便。

Mat组织结构

Mat imga = imread("D:\\cat.jpg");

令人兴奋的是,一般情况下,我们可以把Mat看成是一个存放像素数据的多维数组(一般二维),通过数组操作进行图像处理。

Mat的内部类似于这样:
在这里插入图片描述
噢对!图片的组成类似于这样(可以把(单色)图片看成是各种许多个具有不同亮度的像素点组成的点阵,每下图黄色框内的每个数字都代表着对应点的亮度):
在这里插入图片描述
而彩色图片的数据则像这样组织起来:
For multichannel images the columns contain as many sub columns as the number of channels. For example in case of an BGR color system:(每个像素点都由蓝绿红三个通道的亮度数据组成)
在这里插入图片描述

遍历方法


了解一个数据容器的结构之后,接着就应该思考如何遍历这个容器中的数据,刚才介绍过了,可以使用类似于操作一般数据容器(譬如数组)的方法处理Mat的数据,譬如这样遍历一个装有彩色图片的数据的Mat对象imga

for (int i = 1;i < imga.rows;i++) {
	for (int j = 1;j < imga.cols;j++) {
		for(int c =1;c<imga.channels();c++)
			imga.at<Vec3b>(i, j)[c] = 0;
	}
}

其中:
A、rows(行)和cols(列)都是Mat的属性,(i,j)对应着Mat中某个像素点的数据(包含着BGR三个通道的数据);
B、channels()是Mat的member Function,返回Mat的通道数;
C、imag.at(i,j)[c]可以访问到图片中任一像素点的某一通道的数据,具体介绍参考官方文档的cv::Mat::at部分。

类似的,还可以采用如下方法遍历单通道(灰度)图片的数据:

for (int i = 1;i < imga.rows;i++) {
	for (int j = 1;j < imga.cols;j++) {
		for(int c =1;c<imga.channels();c++)
			imga.at<uchar>(i, j) = 0;
	}
}

当然,也可以采用迭代器的方法遍历:

for (auto it = imga.begin<uchar>();it != imga.end<uchar>();it++) {
	*it = 0;
}

下一节:用图片拼接实例熟悉CV矩阵操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值