Python中imread()函数用法说明
本文详解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,需注意数值越界问题。
以上为个人经验总结,希望能为大家提供参考,也希望大家多多支持本站。如有错误或未考虑周全之处,欢迎指正。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









