imread

义项:图像读取函数
imread

imread是图像处理与科学计算软件中用于从图形文件读取图像数据的函数名,常见于MATLAB和OpenCV两个软件库,也出现在Python的第三方图像库中[1]。它的作用是把磁盘或网络上以JPEG、PNG、TIFF、BMP等格式编码的像素数据解码为程序可直接运算的数组或矩阵对象,是图像显示、分析与计算机视觉流程的第一步。不同软件中的imread名称相同但参数体系与返回值各不相同,其中OpenCV版本默认以BGR通道顺序返回三通道彩色图[2]。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

imread是一个按名称识别的图像读取接口,其功能是把图形文件中压缩编码的像素数据解码,并转换为宿主语言中的数组、矩阵或图像容器对象[1]。它并不是某一个软件独有的函数,而是多个图像处理工具集中约定俗成的同名接口,其中影响最大的是数学软件MATLAB中的imread与开源计算机视觉库OpenCV中的cv::imread。

在MATLAB中,imread属于图形与图像处理的基础输入函数,与imfinfo、imwrite等函数共同构成图像文件的读写体系。在OpenCV中,imread被声明为cv::Mat cv::imread(const String& filename, int flags = IMREAD_COLOR),第一个参数为文件路径,第二个参数控制读取方式并以彩色读取为默认值[1]。

原理

imread的工作过程可分为三步:先依据路径打开文件,再由文件头部的签名或扩展名判定图像格式,最后调用相应格式的解码器把压缩码流还原为像素矩阵[3]。格式判定通常以文件内容为准,OpenCV即通过文件签名而非扩展名识别类型,因此仅改动扩展名并不影响能否读取,这与用户对扩展名的直觉不同。

解码结果的组织方式取决于图像类型。MATLAB中,灰度图像返回 $m \times n$ 数组,真彩色图像返回 $m \times n \times 3$ 数组,使用CMYK色彩空间的TIFF文件返回 $m \times n \times 4$ 数组,索引图像则同时返回图像矩阵与颜色图,颜色图取值被缩放到 $[0,1]$ 区间。返回数组的数据类型与文件的位深相关,每像素1位的图像返回logical类型,每颜色平面2至8位的返回uint8,9至16位的在BMP、JPEG、PNG和TIFF格式下返回uint16。


flowchart LR

A[文件路径与格式参数] --> B[读取文件头/签名]

B --> C[选择格式解码器]

C --> D[还原像素矩阵]

D --> E[转换为数组或Mat对象]

E --> F[返回图像数据 / 颜色图 / 透明度]

两种实现的参数侧重点不同。MATLAB版本可通过idx参数读取多图像文件中的指定帧,支持GIF、CUR、ICO、HDF4和TIFF等格式,还可用PixelRegion名称-值参数只读取指定的行列范围,或用ReductionLevel降低读取分辨率。OpenCV版本则以标志位控制读取结果的形态,如IMREAD_GRAYSCALE强制转为单通道灰度、IMREAD_ANYDEPTH保留16位或32位深度、IMREAD_REDUCED_COLOR_2在读取时把尺寸缩减一半。

发展历程

imread这一名称最早随MATLAB的图像处理功能普及。MATLAB的imread早期与imfinfo、imwrite等函数共同构成图像输入输出工具集,其后逐步扩充格式覆盖范围,例如加入对JPEG 2000的支持,并在后续版本中引入AutoOrient参数,依据Exif方向标记自动校正图像方向,该参数自R2024b起适用于JPEG与TIFF文件[4]。

另一条线索来自OpenCV。OpenCV由英特尔公司发起,项目于1999年启动,第一个预览版本于2000年在国际计算机视觉与模式识别会议(CVPR)上公开,1.0版本于2006年发布[5]。该库的imread随库一同提供,自OpenCV 2起读取结果统一存放在Mat类对象中,此后又被绑定到Python、Java等语言,形成Python中的cv2.imread调用形式[5]。

除上述两处,Python生态中还存在一个独立的第三方imread模块,其0.1版本于2012年2月发布,最初提供PNG、TIFF与JPEG读取支持,其后陆续加入WebP、多页TIFF与LSM、XCF文件的只读支持[6]。另有开源数值计算环境Nelson等以MATLAB语法为参照的实现,也提供同名函数并采用相近的多返回值形式[3]。

应用

读取图像是几乎所有图像相关程序的起点。在MATLAB的典型流程中,调用imread取得数组后可直接交给image或imshow显示,也可将索引图像连同颜色图传入ind2rgb转换为RGB数据,再进行后续的滤波、分割与测量。

在计算机视觉工程中,imread用于把样本图片载入为Mat或NumPy数组,随后送入预处理与模型推理环节。OpenCV的Python绑定使同一调用可用于批量构建训练数据集,因此常见于目标检测与图像分类的数据加载代码[1][7]。

对多帧或多页文件的支持使其也用于时序与体数据处理:MATLAB可一次取回GIF的多帧或TIFF文件中的指定页,也可只读取感兴趣的行列子区域以降低内存占用。此外,filename参数既接受本地路径,也接受URL与远程存储路径,便于直接读取部署在对象存储或分布式文件系统上的图像[4]。

局限

格式支持依赖底层编解码器,因而读取能力会随运行环境变化。OpenCV在Windows与macOS下默认自带libjpeg、libpng、libtiff等编解码器,Linux下则需另行安装,同一文件在不同系统上可能出现可读与不可读的差异;BMP与DIB格式则在任何系统中都始终可以读取。16位压缩BMP(5-6-5格式)在MATLAB中会退化为uint8返回,说明并非所有文件都能保持原始精度。

错误处理方式也构成使用上的限制。OpenCV的imread在文件不存在、路径有误或文件损坏时并不抛出异常,而是返回一个空的Mat对象,Python下对应None,若未检查返回值,错误往往延迟到后续调用才暴露[1][7]。MATLAB版本则要求显式判断数组内容以确认读取成功。

此外,通道顺序与容量上限容易引入偏差。OpenCV读取的彩色图按BGR顺序存放,而matplotlib、PIL及多数深度学习框架按RGB处理,未经转换直接混用会造成颜色错乱[2][7]。OpenCV默认要求读取图像的像素总数小于 $2^{30}$,超过该阈值的卫星遥感或超高分辨率影像需调整参数才能载入。MATLAB方面,imread虽可读取多图像TIFF中的各个图像,却无法访问其中的子图像,此类需求须改用Tiff对象完成。

参见

  • OpenCV —— 提供cv::imread与cv2.imread的开源计算机视觉库

  • MATLAB —— 提供同名图像读取函数的数值计算软件

  • Mat —— OpenCV中承载imread读取结果的矩阵容器类

  • 颜色图 —— 读取索引图像时随像素矩阵一并返回的调色板数据

  • 位深 —— 决定imread返回数组数据类型的像素编码位数

  • imwrite —— 与imread相对应、把数组写回图像文件的函数

参考资料

  1. openCV图像读取和显示 [引用日期2026-10-29]
  2. 02: 基本元素 [引用日期2026-10-29]
  3. imread [引用日期2026-10-29]
  4. imread - 本页对应的英文页面已更新,但尚未翻译 [引用日期2026-10-29]
  5. OpenCV [引用日期2026-10-29]
  6. imread: Image reading library [引用日期2026-10-29]
  7. OpenCV Critical Gotchas [引用日期2026-10-29]
词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:25:37Z

历史版本

本条目引用的词条
OpenCV MATLAB Mat 颜色图 位深 imwrite