Python中imread()函数用法说明

月亮慢半拍
月亮慢半拍
发布时间:2026-10-12| 3人浏览过
原创

本文详解Python中利用cv2、PIL、matplotlib.image、skimage及scipy.misc五种方式读取图片的方法与代码示例。重点对比cv2.imread()与matplotlib.image.imread()在RGB/BGR顺序、格式支持及中文路径处理上的差异,并提供cv2读取含中文路径图片的解决方案。

使用cv2模块读取图片:

# -*- coding: UTF-8 -*-
import cv2
"""
cv2模块--图片的读入和显示
""" 
image_path="D:/PycharmProjects/imageCut/cutted_images/0.jpg" 
img=cv2.imread(image_path)# np.ndarray BGR uint8
cv2.imshow("test_imread",img)# 转为RGB显示
cv2.waitKey()

使用PIL库读取图片:

# -*-coding: UTF-8 -*- 
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt 
image_path="D:/PycharmProjects/imageCut/cutted_images/0.jpg"
 
#PIL
#相关:scipy.misc.imread, scipy.ndimage.imread
#misc.imread 提供可选参数mode,但本质上是调用PIL,具体的模式可以去看srccode或者document
#https://github.com/scipy/scipy/blob/v0.17.1/scipy/misc/pilutil.py
img=Image.open(image_path)
img=np.array(img)# 获得numpy对象, np.ndarray, RGB 
#统一使用plt进行显示,不管是plt还是cv2.imshow,在python中只认numpy.array,但是由于cv2.imread 的图片是BGR,cv2.imshow 时相应的换通道显示
 
plt.imshow(img)
plt.show()

使用matplotlib.image模块读取图片:

# -*-coding: UTF-8 -*-
 
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg 
image_path="D:/PycharmProjects/imageCut/cutted_images/0.jpg" 
img=mpimg.imread(image_path)
 
#统一使用plt进行显示,不管是plt还是cv2.imshow,在python中只认numpy.array,但是由于cv2.imread 的图片是BGR,cv2.imshow 时相应的换通道显示
 
plt.imshow(img)
plt.show()

使用skimage.io模块读取图片:

# -*-coding: UTF-8 -*- 
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from skimage import io 
image_path="D:/PycharmProjects/imageCut/cutted_images/0.jpg"
 
#4 skimge
#caffe.io.load_iamge()也是调用的skimage实现的,返回的是0-1 float型数据
img = io.imread(image_path)
 
#统一使用plt进行显示,不管是plt还是cv2.imshow,在python中只认numpy.array,但是由于cv2.imread 的图片是BGR,cv2.imshow 时相应的换通道显示
 
plt.imshow(img)
plt.show()

使用scipy.misc模块读取图片:

# -*-coding: UTF-8 -*- 
from scipy.misc import imread, imshow, imsave
import matplotlib.pyplot as plt 
image_path="D:/PycharmProjects/imageCut/cutted_images/0.jpg"
 
img = imread(image_path)
# imshow(img) need to set the SCIPY_PIL_IMAGE_VIEWER environment variable to point to the program/executable that can be used to view images on your system
 
plt.imshow(img)
plt.show()
imsave("D:/PycharmProjects/imageCut/cutted_images/1.jpg",img)

补充说明:cv2.imread()与matplotlib.image.imread()在读取图片时的主要区别,以及Python处理中文路径的问题。

1. cv2.imread()与matplotlib.image.imread()对比

除了读取出的颜色通道顺序不同外,两者对图片格式的支持要求也存在差异。

示例:

将文件后缀从.jpg改为.png后,matplotlib.image.imread()可能无法读取,而cv2.imread()则能正常读取。

此外,cv2.imread()默认不支持中文路径,否则无法读取图片,这是OpenCV库的常见限制。

但可以通过以下方式修改,实现支持中文路径的读取:

#cv2识别中文路径
def cv2_imread(img_path):
  cv_img=cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), -1)
  return cv_img
img_y = cv2_imread('E:/哈哈/' + str(number) + '.jpg')
#这个是存储到带有中文路径的文件里面,其中有图像质量的模糊度
cv2.imencode('.jpg', img,[int(cv2.IMWRITE_JPEG_QUALITY),
 random.uniform(30, 50)])[1].tofile("E:/哈哈/" 
+ str(xuhao) + ".jpg")

cv2读取后的图像形式为数组,不同读取函数返回的图像格式可能不同,因此可以根据需要多次采用不同的读取方式进行后续操作。

2. scipy.misc.imread()

该函数读取出的图像为RGB格式,且支持使用中文路径(注意:cv2.imread()读取的图片是BGR格式)。

使用scipy.misc.imsave()可直接保存图像。但需注意,该函数仅能保存uint8类型的数据,因此有时需要明确指定数据类型。其他类似函数也可能存在此类限制。uint8的取值范围是0-255,需注意数值越界问题。

以上为个人经验总结,希望能为大家提供参考,也希望大家多多支持本站。如有错误或未考虑周全之处,欢迎指正。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。