opencv图像融合实现(OpenCV之四)

图像的輸入/輸出C Java Python

从文件中加载图像:

opencv图像融合实现(OpenCV之四)(1)

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

opencv图像融合实现(OpenCV之四)(2)

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

opencv图像融合实现(OpenCV之四)(3)

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

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

基本的图像操作访问像素亮度值C Java Python

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

opencv图像融合实现(OpenCV之四)(4)

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

opencv图像融合实现(OpenCV之四)(5)

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

C 代码

opencv图像融合实现(OpenCV之四)(6)

Python

opencv图像融合实现(OpenCV之四)(7)

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

opencv图像融合实现(OpenCV之四)(8)

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

opencv图像融合实现(OpenCV之四)(9)

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

opencv图像融合实现(OpenCV之四)(10)

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

opencv图像融合实现(OpenCV之四)(11)

内存管理和引用计数C Java Python

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

opencv图像融合实现(OpenCV之四)(12)

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

opencv图像融合实现(OpenCV之四)(13)

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

opencv图像融合实现(OpenCV之四)(14)

基本操作C Java Python

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

opencv图像融合实现(OpenCV之四)(15)

选择感兴趣的区域:

opencv图像融合实现(OpenCV之四)(16)

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

opencv图像融合实现(OpenCV之四)(17)

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

opencv图像融合实现(OpenCV之四)(18)

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

opencv图像融合实现(OpenCV之四)(19)

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

opencv图像融合实现(OpenCV之四)(20)

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

该翻译稿中只添加了C 语言的代码截图,原文中还有Java和python两个版本,请美编组同学添加相应截图。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页