【python+matlab】常见的图像读取、保存、显示库相互转换 对比

文章详细介绍了Python中opencv、matplotlib和PIL库在图像读取、处理和保存方面的使用方法,包括数据类型转换、灰度图像处理、显示图像的注意事项以及不同库之间的格式差异。例如,opencv读取的图片是BGR格式,而matplotlib默认是RGB。imshow函数会根据图像数据类型自动进行归一化操作,因此在显示图像时需要注意数据范围的调整。此外,还提到了numpy在处理图像时的作用,以及如何在不同库之间转换图像格式。
部署运行你感兴趣的模型镜像

常用于图像读取、处理和保存的库:opencv、PIL.Image、plt、numpy

import cv2
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

数据类型

Opencv: Mat为Opencv最重要的数据结构,它在Opencv中被定义为一个类,它通过把图像视为一个矩阵来存储数据。Opencv的函数可以直接处理numpy的数据类型——多维数组

matplotlib.pyplot:读取/展示的图片也是可以直接用numpy处理

PIL:读取数据为PIL类型,不是numpy,需要用np.array()转换为ndarray

读取图像
# cv2
img = cv2.imread(filename, flags)
# flags:标志位,{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED}
# cv2.IMREAD_COLOR 默认参数,保持原始格式的方式读取图像
# cv2.IMREAD_GRAYSCALE 以灰度图像的格式读取
# cv2.IMREAD_UNCHANGED 以BGR图像格式读取,注意是B、G、R,用其他库方法展示图像要注意格式问题

# 灰度图像
cv2.imread(image,0) # 或者cv2.IMREAD_GRAYSCALE 二维数组 如果cv2.IMREAD_COLOR加载灰度图的话还是显示三通道 [H W 1]
cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) # 以BGR形式读取图片后转换为灰度图像

cv2.imread()的函数原型为Mat imread( const string& filename, int flags=1 )

cv2.imread()读进来就是三维/二维numpy数组,可以直接用numpy处理(读取进来是np.int8,后续需要进行归一化)

# plt
img = plt.imread(fname, format=None)

返回值是图片数据data,数据类型是class:numpy.array

# PIL
img = Image.open() # RGB

# 读取灰度图像
img = Image.open(filename).convert('L')
img_array = np.array(img) # 转换为uint8格式
显示图像
# cv2
cv2.imshow('name',img)
cv2.waitKey(0) # 由手动确定下一步操作,否则会出现显示图像一闪而过的情况 多个imshow的话只写一个waitKey(0)就好

特别需要注意的是,对于不同数据格式的图像,imshow()函数会自动进行不同的归一化操作,灰度值是32位浮点数的类型的图像而言(比如通常由深度神经网络得到的结果),imshow()函数会自动将每个像素值乘以255再进行显示,即将原图像素值的范围由[0,1]映射到[0,255],因而注意:期望显示的神经网络输出图像矩阵值必须要归一化到[0,1],而不必多此一举归一化到[0,255]再显示。如果图像显示全黑或者过白这种不正常情况,可能是由于cv2.imshow()自动归一化的结果

1.如果图像数据类型是8U(8位无符号),则直接显示。
2.如果图像数据类型是16U(16位无符号)或32S(32位有符号整数),则imshow函数内部会自动将每个像素值3.除以256并显示,即将原图像素值的范围由[0255*256]映射到[0255]
如果图像数据类型是32F(32位浮点数)或64F(64位浮点数),则imshow函数内部会自动将每个像素值乘以255并显示,即将原图像素值的范围由[01]映射到[0255](注意:原图像素值必须要归一化)

参考(66条消息) Opencv中的imshow函数详解_cv.imshow_进击的路飞桑的博客-优快云博客

# plt
plt.figure()
plt.imshow(img) # 只接受 [0~1] 、[0~255] 范围内的像素值
plt.title('name')
plt.axis('on') # or 'off'
plt.show() # 必须要加

# 显示灰度图像
plt.imshow(img,cmap='gray') # 不加cmap的话会显示伪彩色图
plt.show()

# 用cv2读取plt展示
img = cv2.imread(filename)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 要进行格式的转换
plt.imshow(img)
plt.show()

opencv读入的图片的格式是BGRmatplotlib的图片格式默认是RGB格式

# PIL
img.show()
保存图像
# cv2
img = np.int8(img) # 保存图像之前要注意转换为int8格式 需要将灰度值动态范围调整到[0,255]
cv2.imwrite(filename, img)

OpenCV存储图像使用的是Numpy存储,所以可以将Numpy当做图像类型操作,操作之前还需进行类型转换,转换到int8类型

对于深度学习的网络生成图像而言,如果想通过opencv进行图像显示,需要将灰度值动态范围调整到[0,1],如果想通过opencv进行图像保存,则需要将灰度值动态范围调整到[0,255]

# plt
plt.savefig(fname)

plt保存图像会有白边 我一般不用 一般都是用来保存画的曲线图啥的

pad_inches=0.0好像可以消除白边,可能还需要调节下图像尺寸?

# PIL
img = Image.formarray(img_array.astype(np.int8)) # 需要把矩阵转换为PIL格式 注意需要是uint8格式的数组
img.save(filename)
numpy处理图像

可以直接用numpy处理图像,其实也就是和PIL.Image搭配使用 只不过读入图像之后要转换为ndarray进行后续的处理

# 读取
im = np.array(Image.open(filename)) # 转换为uint8格式的ndarray 需要转换格式的话可以指np.array()的第二个参数
# 灰度图像
im_gray = np.array(Image.open(filename).convert('L'))

# 保存
Image.fromarray(im_f.astype(np.uint8)).save(filename)

使用astype()进行类型转换保存的时候,不会进行比例的缩放,所以当像素值为0.0-1.0之间的时候,需要先将其乘以255,再保存。

matlab中图像的读取、保存和展示

imshow和imwrite要求图像矩阵为[0,255]的uint8类型或[0,1]的浮点类型

# 读取
I = imread(filename)
[M,N] = size(I) # 返回图像的行数M和列数N

# 显示
# 输出多幅图像时,后面的图像总是会覆盖前面的图像 为了同时显示多幅图像,就要用到figure()函数
figure(titlename)
imshow(I, []) # 全部显示 也可以[low,high] 小于low的值显示为黑色,大于high的值显示为白色

figure,imshow() # 这样也可以 保持第一幅图像并同时显示第二幅图像

# 关闭窗口
close(titlename)

# 保存
imwrite(I,'filename') # 保存的图像好像会转换成uint8格式 需要检查一下
参考

Opencv-python(cv2)图像读取、显示与保存,看这一篇就够了_opencv读取索引图像_风雪夜归人o的博客-优快云博客

python matplotlib 显示图像_残月飞雪的博客-优快云博客

Python中读取,显示,保存图片的方法_python 保存图片__icrazy_的博客-优快云博客

Python图像库PIL的类Image及其方法介绍_pil image_Leemboy的博客-优快云博客

01_Numpy的图片处理(读取,变换,保存)_numpy读取图像_饺子大人的博客-优快云博客

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值