关于cv::imread读取图片类型的初探

2023-12-10 10:08

本文主要是介绍关于cv::imread读取图片类型的初探,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于cv::imread读取图片类型的初探

  • 问题来源
  • 环境
  • 首先生成单通道和三通道的png图片
  • cv::imread函数及其参数
  • 不同参数读取rgb图像
  • 不同参数读取单通道图片
  • 遇到的一些情况

问题来源

在处理深度图的时候,在用 cv::imread 读取深度图像时,本以为得到的是单通道图,但实际是三通道图。所以仔细看了一下 cv::imread 函数。

环境

Ubuntu16
Opencv 4.0.0

首先生成单通道和三通道的png图片

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
int main(){cv::Mat mat1(480,480,CV_8UC3,cv::Scalar(255,128,0));cv::imshow("mat1",mat1);cv::Mat mat2(480,480,CV_8UC1,cv::Scalar(128));cv::imshow("mat2",mat2);cv::imwrite("mat1.png",mat1);cv::imwrite("mat2.png",mat2);cv::waitKey(0);return 1;
}

两张图片,一张三通道图片有颜色,一张单通道图片,无颜色。保存成PNG格式。文件大小分别为2.3KB和1.3KB。
在这里插入图片描述

cv::imread函数及其参数

Mat cv::imread (const String & filename, int flags = IMREAD_COLOR 
)enum cv::ImreadModes{IMREAD_UNCHANGED,			//-1   使图像保持原样输出  IMREAD_GRAYSCALE,			//0   把图像转成单通道的灰度图输出IMREAD_COLOR ,				//1	//把图像转成三通道的rgb图输出IMREAD_ANYDEPTH, 			//2   //If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.IMREAD_ANYCOLOR	,			//4   //以任何可能的颜色格式读取图像IMREAD_LOAD_GDAL, 			//8 	//use the gdal driver for loading the imageIMREAD_REDUCED_GRAYSCALE_2,	//16	//输出单通道灰度图,并且将图像缩小为原来的1/2IMREAD_REDUCED_COLOR_2 ,	//17  //输出三通道的rgb图,并且缩小图像到原来的1/2IMREAD_REDUCED_GRAYSCALE_4, //32  //单通道  1/4IMREAD_REDUCED_COLOR_4 ,	//33	//三通道  1/4IMREAD_REDUCED_GRAYSCALE_8, //64	//单通道  1/8IMREAD_REDUCED_COLOR_8 ,	//65	//三通道  1/8IMREAD_IGNORE_ORIENTATION 	//128	//do not rotate the image according to EXIF's orientation flag. 
}

对我们有意义的有参数-1,0,1。
而参数IMREAD_COLOR 默认值为1。
下面是一些具体例子而已。

不同参数读取rgb图像

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
int main(){cv::Mat mat1 = cv::imread("mat1.png");cout<<mat1.type()<<endl;cout<<mat1(cv::Range(0,3),cv::Range(0,3))<<endl;cv::Mat mat1_0 = cv::imread("mat1.png",0);cout<<mat1_0.type()<<endl;cout<<mat1_0(cv::Range(0,3),cv::Range(0,3))<<endl;cv::Mat mat1_1;cv::cvtColor(mat1,mat1_1,cv::COLOR_RGB2GRAY);cout<<mat1_1.type()<<endl;cout<<mat1_1(cv::Range(0,3),cv::Range(0,3))<<endl;return 1;
}

输出

16
[255, 128,   0, 255, 128,   0, 255, 128,   0;255, 128,   0, 255, 128,   0, 255, 128,   0;255, 128,   0, 255, 128,   0, 255, 128,   0]
0
[104, 104, 104;104, 104, 104;104, 104, 104]
0
[151, 151, 151;151, 151, 151;151, 151, 151]

单通道读取不等于直接把图像转为灰度图。

附 cv::Mat.type()

		C1 	C2 	C3 	C4 
CV_8U   0   8   16	24
CV_8S   1   9	17	25
CV_16U  2   10	18	26
CV_16S  3   11	19	27
CV_32S  4   12	20	28
CV_32F  5   13	21	29
CV_64F  6   14	22	30 

不同参数读取单通道图片

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
int main(){cv::Mat mat2 = cv::imread("mat2.png");cout<<mat2.type()<<endl;cout<<mat2(cv::Range(0,3),cv::Range(0,3))<<endl;cv::Mat mat2_00 = cv::imread("mat2.png",-1);cout<<mat2_00.type()<<endl;cout<<mat2_00(cv::Range(0,3),cv::Range(0,3))<<endl;cv::Mat mat2_0 = cv::imread("mat2.png",0);cout<<mat2_0.type()<<endl;cout<<mat2_0(cv::Range(0,3),cv::Range(0,3))<<endl;cv::Mat mat2_1 = cv::imread("mat2.png",1);cout<<mat2_1.type()<<endl;cout<<mat2_1(cv::Range(0,3),cv::Range(0,3))<<endl;return 1;
}

输出:

16
[128, 128, 128, 128, 128, 128, 128, 128, 128;128, 128, 128, 128, 128, 128, 128, 128, 128;128, 128, 128, 128, 128, 128, 128, 128, 128]
0
[128, 128, 128;128, 128, 128;128, 128, 128]
0
[128, 128, 128;128, 128, 128;128, 128, 128]
16
[128, 128, 128, 128, 128, 128, 128, 128, 128;128, 128, 128, 128, 128, 128, 128, 128, 128;128, 128, 128, 128, 128, 128, 128, 128, 128]

参数-1和0是期望的输出。
参数1也按照预期进行了复制。
无参数时,参数并非默认-1 。

当我打出默认参数的时候,才注意到我只需要找到默认参数cv::IMREAD_COLOR(见“cv::imread函数及其参数”),而打印出来是1。

遇到的一些情况

以上笔者读取的是自己制作的图片,但在项目中碰到的一张深度图,如图
在这里插入图片描述
(在此显示不太清楚)
在-1参数下读取的type为2,也即是16UC1。
总结起来,在读取图像后,需要确认读取格式和自己预期是否相同。

这篇关于关于cv::imread读取图片类型的初探的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/476803

相关文章

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php