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

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of