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

相关文章

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷