关于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

相关文章

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

C# WebAPI的几种返回类型方式

《C#WebAPI的几种返回类型方式》本文主要介绍了C#WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的... 目录创建 Controller 和 Model 类在 Action 中返回 指定类型在 Action

在C#中读取文件的六种主流方法详解

《在C#中读取文件的六种主流方法详解》在C#中读取文件有多种方法,不同方式适用于不同场景(小型文件、大型文件、文本文件或二进制文件),本文给大家介绍了6种主流方法以及其适用场景,需要的朋友可以参考下... 目录方法1:File.ReadAllText(读取整个文本文件)方法2:File.ReadAllLin

Python多任务爬虫实现爬取图片和GDP数据

《Python多任务爬虫实现爬取图片和GDP数据》本文主要介绍了基于FastAPI开发Web站点的方法,包括搭建Web服务器、处理图片资源、实现多任务爬虫和数据可视化,同时,还简要介绍了Python爬... 目录一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务

python中的鸭子类型详解

《python中的鸭子类型详解》鸭子类型是Python动态类型系统的灵魂,它通过强调“行为”而非“类型”,赋予了代码极大的灵活性和表现力,本文给大家详细介绍python中的鸭子类型,感兴趣的朋友一起看... 目录1. 核心思想:什么是鸭子类型?2. 与“传统”静态类型语言的对比3. python 中无处不在

利用Python将PDF文件转换为PNG图片的代码示例

《利用Python将PDF文件转换为PNG图片的代码示例》在日常工作和开发中,我们经常需要处理各种文档格式,PDF作为一种通用且跨平台的文档格式,被广泛应用于合同、报告、电子书等场景,然而,有时我们需... 目录引言为什么选择 python 进行 PDF 转 PNG?Spire.PDF for Python

Java枚举类型深度详解

《Java枚举类型深度详解》Java的枚举类型(enum)是一种强大的工具,它不仅可以让你的代码更简洁、可读,而且通过类型安全、常量集合、方法重写和接口实现等特性,使得枚举在很多场景下都非常有用,本文... 目录前言1. enum关键字的使用:定义枚举类型什么是枚举类型?如何定义枚举类型?使用枚举类型:2.

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni