python-opencv第二期:imwrite函数详解

article/2025/10/3 9:08:27

概要:众嗦粥之所周知,在如今计算机视觉(Computer Version short for CV)是人工智能与机器人技术发展的一个重大研究方向,而opencv作为一个专门为计算机视觉编程提供技术与函数支持的第三方库,自然是一个需要重点研究的内容。本文就将介绍其中一个较为基础的函数——imwrite函数,将我们编辑后的图片矩阵以文件的形式储存起来,与我们第一期的imread函数形成呼应关系。(唱山歌(bushi)

本文依旧是请出“饥荒”中的角色“温蒂姐妹”作为我们今天的实例操作对象(温蒂:我的花去哪了),如下图所示。话不多说,我是Kamen Black君,马上开始今天的学习。

201bd4c6cf90495aa32a1f22efa10d00.png

正文内容:

56b8d441e6d74b53b6c2f8848c71de66.jpeg

print("祝大家每天快乐,love and peace!")

①使用前准备:

首先依旧是调用opencv的第三方库,作为我们使用imwrite函数的大前提。

import cv2

②语法说明:

cv2.imwrite(filename,img,params)

其中,filename的数据类型是const String&,这里要填入的参数是我们选择来要保存编辑后图片的路径,要注意的是,要加上诸如jpg、png的后缀,不然可是会有很可怕的惩罚的哦(报错);

           img的数据类型是array(即数组类型),这里一般情况下要填入的是8位单通道或3通道(带有BGR通道顺序)图像,但是凡事都有例外(规则都是用来打破的!),如下所示:

imwrite函数是基于文件扩展名选择图像的格式。通常,使用此功能只能保存8位单通道或3通道(带有BGR通道顺序)图像,但有以下例外:

▶对于PNG,JPEG2000和TIFF格式,可以保存16位无符号(CV_16U)图像。


▶32位浮点(CV_32F)图像可以保存为PFM,TIFF,OpenEXR和Radiance HDR格式; 使用LogLuv高动态范围编码(每像素4个字节)保存3通道(CV_32FC3)TIFF图像。


▶可以使用此功能保存带有Alpha通道的PNG图像。为此,创建8位(或16位)4通道图像BGRA,其中alpha通道最后。完全透明的像素应该将alpha设置为0,完全不透明的像素应该将alpha设置为255/65535。


如果格式,深度或通道顺序不同,请在保存之前使用Mat :: convertTo和cv :: cvtColor进行转换。或者,使用通用FileStorage I / O函数将图像保存为XML或YAML格式。

             params 的数据类型是const int&,可以不进行写入(有默认状态),也可以多个写入,具体格式请见实例操作部分。这里要填入的参数是用来表示图片要被特定格式保存的,有些参数也可以用相应的整数来进行表示,如下所示:

params的分类与作用
cv2.IMWRITE_JPEG_QUALITY对于JPEG,它可以是从0到100的质量(越高越好)。默认值为95。
cv2.IMWRITE_JPEG_PROGRESSIVE启用JPEG功能,0或1,默认为False。
cv2.IMWRITE_JPEG_OPTIMIZE启用JPEG功能,0或1,默认为False。
cv2.IMWRITE_JPEG_RST_INTERVALJPEG重启间隔,0 - 65535,默认为0 - 无重启。
cv2.IMWRITE_JPEG_LUMA_QUALITY单独的亮度质量等级,0 - 100,默认为0 - 不使用。
cv2.IMWRITE_JPEG_CHROMA_QUALITY单独的色度质量等级,0 - 100,默认为0 - 不使用。
cv2.IMWRITE_PNG_COMPRESSION对于PNG,它可以是从0到9的压缩级别。值越高意味着更小的尺寸和更长的压缩时间。如果指定,则策略更改为IMWRITE_PNG_STRATEGY_DEFAULT(Z_DEFAULT_STRATEGY)。默认值为1(最佳速度设置)。
cv2.IMWRITE_PNG_STRATEGY其中一个品种:ImwritePNGFlags,默认为IMWRITE_PNG_STRATEGY_RLE。
cv2.IMWRITE_PNG_BILEVEL二进制级别PNG,0或1,默认为0。
cv2.IMWRITE_PXM_BINARY对于PPM,PGM或PBM,它可以是二进制格式标志,0或1.默认值为1。
cv2.IMWRITE_EXR_TYPE
cv2.IMWRITE_WEBP_QUALITY

覆盖EXR存储类型(默认为FLOAT(FP32))

对于WEBP,它可以是1到100的质量(越高越好)。默认情况下(不带任何参数),如果质量高于100,则使用无损压缩。

cv2.IMWRITE_PAM_TUPLETYPE对于PAM,将TUPLETYPE字段设置为为格式定义的相应字符串值。
cv2.IMWRITE_TIFF_RESUNIT对于TIFF,用于指定要设置的DPI分辨率单位; 请参阅libtiff文档以获取有效值。
cv2.IMWRITE_TIFF_XDPI对于TIFF,用于指定X方向DPI。
cv2.IMWRITE_TIFF_YDPI对于TIFF,用于指定Y方向DPI。
cv2.IMWRITE_TIFF_COMPRESSION对于TIFF,用于指定图像压缩方案。请参阅libtiff以获取与压缩格式对应的整数常量。注意,对于深度为CV_32F的图像,仅使用libtiff的SGILOG压缩方案。对于其他支持的深度,可以通过此标志指定压缩方案; LZW压缩是默认值。
cv2.IMWRITE_JPEG2000_COMPRESSION_X1000对于JPEG2000,用于指定目标压缩率(乘以1000)。该值可以是0到1000.默认值是1000

 (小声BB:那么多,但常用的其实没几个) 

③实例操作:

1、普通版温蒂姐妹:

>>> import cv2
>>> img=cv2.imread("F://wendy.png")
>>> cv2.imwrite("F://1.jpeg",img)
True

6cde8861276b4b8ea722ff48d0141f43.jpeg

2、无损版温蒂姐妹:

>>> cv2.imwrite("F://4.jpeg",img,[cv2.IMWRITE_JPEG_QUALITY,100])
True

3b9aa501dba4485a8873eead163140ad.jpeg

3、战损版温蒂姐妹:

>>> cv2.imwrite("F://2.jpeg",img,[cv2.IMWRITE_JPEG_QUALITY,10])
True

5506883d5ae54521af4c0acedf6c6b0b.jpeg

4、超高校级战损版温蒂姐妹:

>>> cv2.imwrite("F://3.jpeg",img,[cv2.IMWRITE_JPEG_QUALITY,2])
True

a1f4acd104e94721b19488038ed4dd51.jpeg

5、多参数演示:

>>> cv2.imwrite("F://5.jpeg",img,[cv2.IMWRITE_JPEG_LUMA_QUALITY,10,cv2.IMWRITE_JPEG_QUALITY,100])
True

954871c634a0431195a5fdb76462729b.jpeg

>>> cv2.imwrite("F://6.jpeg",img,[cv2.IMWRITE_JPEG_QUALITY,100,cv2.IMWRITE_JPEG_LUMA_QUALITY,10])
True

eb901841e9f140f9a9ce66548d97921c.jpeg

通过上面两个栗子例子,我们可以得出结论:如果存在冲突的情况,位于后端的参数设置占据主导地位。可能就是所谓的后来者居上吧。

结语: 好了以上就是所有的内容,希望大家多多关注,点赞,收藏,这对我有很大的帮助。国康家安,大家下次再见喽!!!溜溜球~~

26d53210a1ce44f293c2d4a2ded15e82.jpeg7cf5685363524cf89f3e960333b03482.jpeg

参考文章:OpenCV笔记1:用imwrite函数来保存图片


http://chatgpt.dhexx.cn/article/K7X1tWOK.shtml

相关文章

mongodb自增主键ObjectID

一、了解mongodb的ObjectID MongoDB的文档固定是使用“_id”作为主键的,它可以是任何类型的,默认是个ObjectId对象(在Java中则表现为字符串),那么为什么MongoDB没有采用其他比较常规的做法(比如MySql的自增…

java 生成objectid_算法~位运算ObjectId生成时的秒用

位运算控制数字范围 通过位运算,可以对一个数进行限制,保证这个数在2n-1(3,7,15,31,63,127,255...)范围内,当大于指定的数时,会取这个0到2n-1里的某个数,不会让它溢出。 之前我写过的位运算的文章 本文在ObjectId里的应…

mongodb objectid java_我可以确定字符串是否是MongoDB ObjectID吗?

回答(10) 2 years ago 我发现mongoose ObjectId验证器用于验证有效的objectIds,但我发现了一些无效ID被认为有效的情况 . (例如:任何12个字符长的字符串) var ObjectId require(mongoose).Types.ObjectId; ObjectId.isValid(microsoft123); //true Obje…

MongoDB 认识ObjectId

官方文档:https://docs.mongodb.com/manual/reference/method/ObjectId/ 现在我们有一个集合如下 db.class0.insertMany([{"name": "一年级一班","headmaster": "王老师"},{"name": "一年级二班",&q…

mysql objectid_【Mongodb】_id和ObjectId详解!

2.6.6 _id和ObjectId MongoDB 中存储的文档必须有一个"_id" 键。这个键的值可以是任何类型的,默认是个ObjectId 对象。在一个集合里面,每个文档都有唯一的"_id" 值,来确保集合里面每个文档都能被唯一标识。如果有两个集合…

Mongodb ObjectId格式

ObjectId是一个24位的字符串,实际是由一组十六进制的字符构成,共12个字节。(1个字节8位能表示2个十六进制数,12个字节能表示24个十六进制数)。 ObjectId 是一个12字节 BSON 类型数据,有以下格式&#xff1a…

java objectid_关于MongoDB ObjectId

ObjectId的构成 ObjectId的值由12个字节组成,其中, 4个字节表示时间戳(自Unix纪元以来的秒数),记录创建时间; 3个字节表示机器标识符,保证不同主机产生不同的ObjectId值; 2个字节表示进程ID,保证…

从根上理解MongoDB的ObjectId生成原理!

想写这篇文章好久了,一直抽不出时间。这两天端午节放假,我和娃都泡在图书馆,在他看书的空闲期,我拿出电脑写下了本文。 我们都知道,在分布式系统中,分布式 ID 有很多特殊的要求,其中之二就是要求…

ArcGIS中的OBJECTID、FID 和 OID 的区别!不要傻傻分不清

喜欢就关注我们吧 时常有很多我朋友分不清OBJECTID、FID 和 OID有什么区别,不懂得怎么应用和管理,今天我们来说个明白。 ArcGIS Desktop 产品要求独立表和属性表均具有 ObjectID字段,该字段包含唯一的长整型用于标识每个记录。 此 ID 由 Esri…

Mongo中id介绍

好记忆不如按烂笔头 ,即便是最简单的,时间长了也难免会忘记,记下可以让你更明白。 2.6.6 _id和ObjectId MongoDB 中存储的文档必须有一个"_id" 键。这个键的值可以是任何类型的,默认是个ObjectId 对象。在一个集合里面…

canal

简介 canal [kənl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增…

阿里的数据同步神器——Canal

前言 同步数据的神器: Canal安装配置 canal [kə’nl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署, 存在跨机房同步的业务需求, 实现方式主要是基于业务 trigger 获取增量变更。从 2…

使用Canal组件订阅MySQL binlog数据增量

一、简介 Canal是一款强大的开源组件,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 1. canal 工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议MySQ…

mysql进阶:canal搭建主从|集群架构

0.引言 之前我们讲解过canal的各种应用,但是对于生产环境来讲,服务高可用是必须保证的。因此canal单节点是不能满足我们的需求的。就需要搭建canal集群。 1. canal集群模式 从架构方式上出发,我们用来保证服务高可用的手段主要是主从架构、…

ElasticSearch 7.15.2 使用java canal 接入实现灵活化增量数据准实时同步

前言: ①canal.adapter-1.1.5 支持一对一单表的增量数据同步ElasticSearch 7; ②对于多表聚合场景的SQL满足不了我们的业务需求。 ③采用java canal 接入,可以实现灵活化增量数据准实时同步 文章目录 一、java canal 接入1. 依赖导入2. 增加配…

浅入浅出keepalived+mysql实现高可用双机热备

当数据库发生宕机的情况,如果配置了数据库主从同步模式或主主同步模式,则可以从从库中获取数据。 当数据库发生宕机的情况,要求应用系统实现高可用,应用系统不会受到影响,需要对mysql进行双机热备实现数据库的高可用。 实现双机热备的方式有Mycat组件方式、canel组件方式、…

【硬刚大数据】大数据同步工具之FlinkCDC/Canal/Debezium对比

欢迎关注博客主页:微信搜:import_bigdata,大数据领域硬核原创作者_王知无(import_bigdata)_CSDN博客 欢迎点赞、收藏、留言 ,欢迎留言交流!本文由【王知无】原创,首发于 CSDN博客!本文首发CSDN论…

4、Canal的 instance模块

一、总体结构 如确所述,Canal server的模式有两种:manager和spring 在core模块中,定义了CanalInstance接口,以及其抽象类子类AbstractCanalInstance。 在spring模块,提供了基于spring配置方式的CanalInstanceWithSpr…

canal实现mysql数据同步

前言 canal是实现mysql数据备份,异地灾备,异地数据同步等重要的中间件,在实际的业务场景中有着广泛的使用,本文基于小编所在项目中一个异地数据同步的场景为例,通过案例演示下利用canal实现mysql数据同步的过程 同步原理 如上图所示,为canal同步mysql数据的原理的简单示…

SpringBoot系列之canal和kafka实现异步实时更新

SpringBoot系列之canal和kafka实现异步实时更新 实验开发环境 JDK 1.8SpringBoot2.2.1Maven 3.2+开发工具 IntelliJ IDEAsmartGit1、什么是阿里canal? canal是阿里开源的, 对数据库增量日志解析,提供增量数据订阅和消费的组件。引用官网的图片,canal的工作原理主要是模拟…