Matlab中imwrite函数使用

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

目录

语法

说明

示例

将灰度图像写入 PNG

将索引图像数据写入 PNG

用 MATLAB 颜色图写入索引图像

将真彩色图像写入 JPEG

将多个图像写入 TIFF 文件

写入 GIF 动画


        imwrite函数的作用是将图像写入图形文件。

语法

imwrite(A,filename)
imwrite(A,map,filename)
imwrite(___,fmt)
imwrite(___,Name,Value)

说明

imwrite(A,filename) 将图像数据 A 写入filename指定的文件,并从扩展名推断出文件格式。imwrite 在当前文件夹中创建新文件。输出图像的位深度取决于A的数据类型和文件格式。对于大多数格式来说:

  • 如果 A 属于数据类型uint8,则imwrite输出 8 位值。

  • 如果 A 属于数据类型uint16且输出文件格式支持 16 位数据(JPEG、PNG 和 TIFF),则imwrite将输出 16 位的值。如果输出文件格式不支持16位数据,则imwrite返回错误。

  • 如果 A 是灰度图像或者属于数据类型 double 或 single 的 RGB 彩色图像,则imwrite假设动态范围是[0,1],并在将其作为8位值写入文件之前自动按255缩放数据。如果A中的数据是single,则在将其写入 GIF 或 TIFF 文件之前将 A 转换为 double。

  • 如果 A 属于 logical 数据类型,则 imwrite 会假定数据为二值图像并将数据写入位深度为 1 的文件(如果格式允许)。BMP、PNG 或 TIFF 格式以输入数组形式接受二值图像。

        如果 A 包含索引图像数据,则应另外指定 map 输入参数。

imwrite(A,map,filename) 将 A 中的索引图像及其关联的颜色图写入由 map filename 指定的文件。

  • 如果 A 是属于数据类型 double 或 single 的索引图片,则 imwrite通过从每个元素中减去1来将索引转换为从0开始的索引,然后以uint8形式写入数据。如果A中的数据是single,则在将其写入GIF或 TIFF 文件之前将A转换为double。

imwrite(___,fmt) 以 fmt 指定的格式写入图像,无论filename中的文件扩展名如何。可以在任何先前语法的输入参数之后指定 fmt。

​imwrite(___,Name,Value) 使用一个或多个名称-值对组参数,以指定 GIF、HDF、JPEG、PBM、PGM、PNG、PPM 和 TIFF 文件输出的其他参数。可以在任何先前语法的输入参数之后指定 Name,Value。

示例

将灰度图像写入 PNG

        将一个 100×100 的灰度值数组写入当前文件夹中的 PNG 文件。

A = rand(100);
imwrite(A,'myGray.png')

将索引图像数据写入 PNG

        将索引图像数组和其关联的颜色图写入 PNG 文件。从文件clown.mat中加载示例图像数据。

load clown.mat

        图像数组X和其关联颜色图map均加载至 MATLAB® 工作区。将数据写入新的 PNG 文件。

imwrite(X,map,'myclown.png')

        imwrite 在当前文件夹中创建文件 myclown.png。在 MATLAB 之外打开新文件来查看新建的文件。

用 MATLAB 颜色图写入索引图像

        用 MATLAB 内置的颜色图 copper 将图像数据写入新的 PNG 文件。从文件 clown.mat 中加载示例图像数据。

load clown.mat

        图像数组 X 和其关联颜色图 map 均加载至 MATLAB 工作区。map 是一个 81 RGB 向量矩阵。用 81 RGB 向量定义铜色调颜色图。然后,使用这个新的颜色图将图像数据写入 PNG 文件。

newmap = copper(81);
imwrite(X,newmap,'copperclown.png');

        imwrite在当前文件夹中创建文件copperclown.png。在 MATLAB 之外打开新文件来查看新建的文件。

将真彩色图像写入 JPEG

        创建真彩色图像数据并将其写入 JPEG 文件。创建一个随机 RGB 值的 49×49×3 数组。

A = rand(49,49);
A(:,:,2) = rand(49,49);
A(:,:,3) = rand(49,49);

        将图像数据写入 JPEG 文件,并用 'jpg' 指定输出格式。使用 'Comment' 名称-值对组参数添加文件注释。

imwrite(A,'newImage.jpg','jpg','Comment','My JPEG file')

        查看有关新文件的信息。

imfinfo('newImage.jpg')
ans = Filename: 'S:\newImage.jpg'FileModDate: '25-Jan-2013 16:18:41'FileSize: 2339Format: 'jpg'FormatVersion: ''Width: 49Height: 49BitDepth: 24ColorType: 'truecolor'FormatSignature: ''NumberOfSamples: 3CodingMethod: 'Huffman'CodingProcess: 'Sequential'Comment: {'My JPEG file'}

将多个图像写入 TIFF 文件

        将多个图像写入一个多页 TIFF 文件。创建两个随机图像数据集 im1 和 im2。

im1 = rand(50,40,3);
im2 = rand(50,50,3);

        将第一个图像写入新的 TIFF 文件。然后将第二个图像添加至同一文件。

imwrite(im1,'myMultipageFile.tif')
imwrite(im2,'myMultipageFile.tif','WriteMode','append')

写入 GIF 动画

        绘制一系列图、将它们捕获为图像,然后写入 GIF 动画文件。绘制 $y = x^{n}$,其中 $n = 3$

x = 0:0.01:1;
n = 3;
y = x.^n;
plot(x,y,'LineWidth',3)
title(['y = x^n,  n = ' num2str(n) ])

        捕获 $n$ 值递增时的一系列绘图。

n = 1:0.5:5;
nImages = length(n);fig = figure;
for idx = 1:nImagesy = x.^n(idx);plot(x,y,'LineWidth',3)title(['y = x^n,  n = ' num2str( n(idx)) ])drawnowframe = getframe(fig);im{idx} = frame2im(frame);
end
close;

        将多个系列的图像显示在一个图窗中。

figure;
for idx = 1:nImagessubplot(3,3,idx)imshow(im{idx});
end

        将九个图像保存到一个 GIF 文件中。因为 GIF 文件不支持三维数据,所以应调用rgb2ind,使用颜色图map将图像中的 RGB 数据转换为索引图像A。要将多个图像添加到第一个图像中,请使用名称-值对组参数 'WriteMode','append' 调用 imwrite。

filename = 'testAnimated.gif'; % Specify the output file name
for idx = 1:nImages[A,map] = rgb2ind(im{idx},256);if idx == 1imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);elseimwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);end
end

        imwrite将 GIF 文件写入当前文件夹。名称-值对组 'LoopCount',Inf 使动画连续循环。'DelayTime',1 在每个动画图像显示之间指定了一秒的时滞。

A - 图像数据

        图像数据,指定为满(非稀疏)矩阵。

  • 对灰度图像而言,A 可以是 m×n。

  • 对索引图像而言,A 可以是 m×n。指定 map 输入参数中的相关颜色图。

  • 对真彩色图像而言,A 必须是 m×n×3 的矩阵。imwrite 不支持将 RGB 图像写入 GIF 文件。

        对于 TIFF 文件而言,A 可以是 m×n×4 数组,其中包含使用 CMYK 颜色空间的颜色数据。对于多帧 GIF 文件而言,A 可以是包含灰度图像或索引图像的 m×n×1×p 数组,其中 p 是写入帧的数量。这种情况不支持 RGB 图像。

filename - 输出文件名

        输出文件的名称,指定为字符向量或字符串标量。根据写入的位置,filename 可以采用以下形式之一。

位置

形式

当前文件夹

要写入当前文件夹,请在 filename 中指定文件名。filename 必须包含文件扩展名。

例如:'myImage.jpg'

其他文件夹

要写入不同于当前文件夹的文件夹,请在 filename 中指定完整或相对路径名称。

例如:'C:\myFolder\myImage.ext'

例如:'\imgDir\myImage.ext'

map - 索引图像的颜色图

        A中与索引图像数据相关联的颜色图,指定为 m×数组。map必须是有效的 MATLAB 颜色图。可以参考colormap以了解 MATLAB 内置颜色图列表。大多数图像文件格式都不支持条目数超过 256 个的颜色图。

fmt - 输出文件格式

        输出文件的格式,指定为下表中的格式之一。此表还概述了 imwrite 可写入的图像类型。MATLAB 文件格式注册表会确定支持哪些文件格式。对某些格式而言,imwrite 可以接受其他名称-值对组参数。

fmt 的值

输出文件格式

说明

'bmp'

 

Windows® 位图 (BMP)

1 位、8 位和 24 位未压缩图像

'gif'

GIF-图形交换格式

8 位图像

'hdf'

HDF4-分层数据格式

 

带或不带关联颜色图的 8 位光栅图像数据集、24 位光栅图像数据集

'jpg' 或 'jpeg'

JPEG-联合图像专家组



8 位、12 位和 16 位基准 JPEG 图像

注意:imwrite 会先将索引图像转换为 RGB 图像,然后再将数据写入 JPEG 文件,因为 JPEG 格式不支持索引图像。

'jp2' 或 'jpx'

JPEG 2000-联合图像专家组

1 位、8 位 和 16 位 JPEG 2000 图像

'pbm'

可移植位图(PBM)


 

任何 1 位 PBM 图像、ASCII(普通)或原始(二进制)编码

'pcx'

Windows 画笔 (PCX)


 

8 位图像

'pgm'


 

可移植灰度图(PGM)

任何标准 PGM 图像;使用任意颜色深度编码的 ASCII(普通)图像;每个灰度值最多使用 16 位编码的原始(二进制)图像

'png'

PNG-可移植网络图形



1 位、2 位、4 位、8 位和 16 位灰度图像;带有 alpha 通道的 8 位和 16 位灰度图像;1 位、2 位、4 位和 8 位索引图像;24 位和 48 位真彩色图像;带有 alpha 通道的 24 位和 48 位真彩色图像

注意:imwrite 函数不支持写入颜色图条目不足的索引 PNG 文件。

'pnm'

可移植任意图(PNG)

 

自动选择的 PPM/PGM/PBM 任意格式

'ppm'


 

可移植像素图(PPM)

任何标准 PPM 图像:使用任意颜色深度编码的 ASCII(普通)图像,或每个颜色分量最多使用 16 位编码的原始(二进制)图像

'ras'

Sun™光栅(RAS)

 

任何 RAS 图像,包括 1 位位图、8 位索引图像、带有 alpha 的 24 位真彩色图像和 32 位真彩色图像

'tif' 或 'tiff'

标记图像文件格式(TIFF)

 

基线 TIFF 图像,包括:

  • 1 位、8 位、16 位、24 位和 48 位未压缩的图像以及采用 Packbit 、LZW 或 Deflate 压缩的图像

  • 采用 CCITT 1D、Group 3 和 Group 4 压缩的 1 位图像

  • CIELAB、ICCLAB 和 CMYK 图像

'xwd'

 

X 窗口转储 (XWD)

8 位 ZPixmaps


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

相关文章

【OpenCV 例程300篇】02. 图像的保存(cv2.imwrite)

专栏地址:『youcans 的 OpenCV 例程300篇 - 总目录』 01. 图像的读取(cv2.imread) 02. 图像的保存(cv2.imwrite) 03. 图像的显示(cv2.imshow) 04. 用 matplotlib 显示图像(plt.imsho…

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

概要:众嗦粥之所周知,在如今计算机视觉(Computer Version short for CV)是人工智能与机器人技术发展的一个重大研究方向,而opencv作为一个专门为计算机视觉编程提供技术与函数支持的第三方库,自然是一个需要…

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…