imread
定义
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图像读取和显示 [引用日期2026-10-29]
- 02: 基本元素 [引用日期2026-10-29]
- imread [引用日期2026-10-29]
- imread - 本页对应的英文页面已更新,但尚未翻译 [引用日期2026-10-29]
- OpenCV [引用日期2026-10-29]
- imread: Image reading library [引用日期2026-10-29]
- OpenCV Critical Gotchas [引用日期2026-10-29]