独家|OpenCV 1.4 对图像的操作

数据派THU

共 2584字,需浏览 6分钟

 · 2021-08-04

翻译:陈之炎

校对:吴振东


本文约2400字,建议阅读5分钟

本文为大家系统地介绍了OpenCV对图像的操作。


图像的输入/输出


从文件中加载图像:


如果读入的是一个JPG文件,默认状态下会创建一个3通道图像。如果你需要将其制成灰度图像,则使用以下代码:



文件格式由其内容(前几个字节)确定。将图像保存为一个文件:



文件的格式由其扩展名确定。

用CV :: imdecode和CV :: imencode从内存中读取和写入图像。

基本的图像操作


访问像素亮度值


为了获取像素亮度值,首先必须知道图像的类型和通道数。下面是一个单通道灰度图像的示例(数据类型8UC1)和像素坐标x和y:


C ++版本:intensity.val [0]包含从0到255的值,需要注意的是x和y的排序。OpenCV图像采用了结构化的矩阵来表示,使用以下两种情形使用同样的协议 - 基于0的行索引(或y坐标)在先,后面跟随基于0的列索引(或x坐标)。此外,也可以使用下面的符号(仅适用于C ++ ):


下面,来看一个BGR色彩排序的3通道图像(由imread返回默认格式):

C ++代码


Python



对于数据类型为浮点值的图像,可以使用相同的方法(例如,可以通过运行Sobel算子获取一个通道的图像)(仅适用于C ++):


利用相同的方法可以修改像素亮度值:


OpenCV中有一些函数,尤其是在calib3d模块中,如CV :: projectPoints函数,可以将 2D或3D像素点值转换成Mat形式的矩阵。该矩阵包含一列,每一行对应于一个点,矩阵类型为32FC2或32FC3。利用std::vector可以很容易地构建出这样的矩阵(仅适用于C ++):


利用相同的方法Mat::at可以访问矩阵中的点(仅适用于C ++):


内存管理和引用计数


Mat是保持矩阵/图像特性的一种结构(包括行数和列数,数据类型等)和一个指向数据的指针。对应一个相同的图像数据,可以构建出多个Mat实例,此外, Mat还包含一个引用计数器,当Mat对象被释放时,利用引用计数器指针来决定是否重新分配数据。下面的这个例子是在不进行数据复制的情况下,创建两个MAT矩阵: (仅适用于C ++)


结果得到了一个3列的32FC1矩阵,而不是一个1列的32FC3矩阵。pointsMat使用像素点的数据,释放时无需重新分配内存。在这种特殊情况下,开发人员必须确保 points的生命周期要比比pointsMat的生命周期更长。如果需要复制数据的话,则使用cv::Mat::copyTo或者 cv::Mat::clone两个函数:


应为上述每个函数提供一个空的Mat输出,每一次实现均是对目标矩阵调用一次Mat::create。如果矩阵为空,则利用该方法为矩阵分配数据。如果矩阵不为空,并且大小和数据类型均无误,则该方法不起作用。然而,如果大小或数据类型与输入参数不同,则重新分配(和丢失)原有数据,重新分配一个新的数据:



基本操作

每一个像素矩阵均定义有一些快捷的操作符。例如,下面是如何从现有的灰度图像中提取出黑色图像IMG


选择感兴趣的区域:


将彩色图像转换成灰度图像:


将图像类型从8UC1变为 32FC1:


可视化图像


在算法开发过程中,如果能看到运行的中间结果是非常有用的。OpenCV提供了一种可视化图像的便捷方式。采用以下代码可以显示一副8U图像:



调用waitKey()函数启动消息传递周期,等待“图像”窗口的一次键盘键入。此时,需要将32F图像转换为8U类型的图像。例如:




这里没有必要使用CV :: namedWindow函数,因为它后面紧跟着CV :: imshow。然而,可以用cv::createTrackbar来改变窗口属性。


本文以C++语言代码为例,获取Java和python版本可在原文中查看:
https://docs.opencv.org/4.5.2/d5/d98/tutorial_mat_operations.html

编辑:王菁
校对:汪雨晴

下一小节:1.5 利用OpenCV叠加(混合)两幅图像

往期回顾:
独家|OpenCV 1.1 Mat - 基本图像容器(附链接)

独家|OpenCV 1.2 如何用OpenCV扫描图像、查找表和测量时间(附链接)

独家|OpenCV 1.3 矩阵的掩膜操作(附链接)





译者简介





陈之炎,北京交通大学通信与控制工程专业毕业,获得工学硕士学位,历任长城计算机软件与系统公司工程师,大唐微电子公司工程师,现任北京吾译超群科技有限公司技术支持。目前从事智能化翻译教学系统的运营和维护,在人工智能深度学习和自然语言处理(NLP)方面积累有一定的经验。业余时间喜爱翻译创作,翻译作品主要有:IEC-ISO 7816、伊拉克石油工程项目、新财税主义宣言等等,其中中译英作品“新财税主义宣言”在GLOBAL TIMES正式发表。能够利用业余时间加入到THU 数据派平台的翻译志愿者小组,希望能和大家一起交流分享,共同进步

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。


点击文末“阅读原文”加入数据派团队~



转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。



点击“阅读原文”拥抱组织



浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报