参考文章:Python学习小技巧——opencv、pillow和matplotlib的区别_pillow和opencv区别-CSDN博客
1 概念的比较:
opencv
(1)默认不支持中文文件名
(2)数据为numpy,维度:高,宽,通道数,通道序:BGR
(3)显示完后要cv2.destroyAllWindows()
(4)读取图片时与pillow速度差不多
pillow
(1)python原生支持最好,各种操作都很方便,pytorch内部使用的就是pillow
(2)读入的是一个Image类,size的顺序:宽,高,通道序RGB
(3)保存图片时比opencv快
(4)在大量图片数据读写时可以优先考虑pillow
matplotlib
(1)读入数据格式最为便准,numpy格式,维度:高,宽,通道数,通道序:RGB
(2)交互模式中只要用plt.imshow()就直接显示图片了,脚本模式中要多加一句plt.show()
(3)opencv转matplotlib时rgb_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
(4)可以制作坐标图
英文可以用OpenCV直接在画面上显示,中文需要Pillow去写字
2 OpenCV处理图片
opencv读、写以及展示图片等操作
import cv2# opencv读、写以及展示图片等操作
image = cv2.imread(r"000000.jpg") # 读取图片
cv2.namedWindow('img1', cv2.WINDOW_NORMAL) # 建立名为img的窗口
cv2.imshow('img1', image) # 在ing窗口展示图片
cv2.waitKey(2000) # 2s后自动销毁
cv2.imwrite(r"1.png", image) # 写入图片
GrayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 灰度化
cv2.namedWindow('img2', cv2.WINDOW_NORMAL)
cv2.imshow('img2', GrayImage)
cv2.waitKey(2000)
cv2.destroyAllWindows() # 关闭全部窗口
cv2.imwrite(r"2.png", GrayImage)
输出结果如图示:
opencv读取图片的形状、大小、编码格式及数据类型等
import cv2image = cv2.imread(r"000000.jpg") # 读取图片
GrayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # opencv读取图片默认为BGR格式,灰度化
print(image.shape) # opencv读取图片的shape为高、宽、通道数
print(image.size) # opencv读取图片的size为像素和
print(GrayImage.shape) # opencv读取灰度图的shape为高、宽(通道数默认为1不显示)
print(GrayImage.size) # opencv读取灰度图的size为像素和
print(image.dtype) # opencv读取图片的编码格式
print(GrayImage.dtype) # opencv读取灰度图的编码格式
print(type(image)) # opencv读取图片的数据类型
print(type(GrayImage)) # opencv读取灰度图的数据类型
# print(image) # opencv读取图片的图片数据
# print(GrayImage) # opencv读取灰度图的图片数据
输出结果如图示:
3 pillow处理图片
读、写以及展示图片等操作
from PIL import Image# pillow读、写以及展示图片等操作
img = Image.open("000000.jpg").convert('RGB') # pillow默认RGB格式
img.show() # 展示图片
img.save("img1") # 保存图片img1
Grayimg = Image.open("000000.jpg").convert('L') # 灰度化
Grayimg.show() # 展示图片
Grayimg.save("Grayimg1") # 保存图片Grayimg1
输出结果如图示:
pillow读取图片的宽高、数据类型及图片数据等
from PIL import Image# pillow处理图片
img = Image.open("000000.jpg").convert('RGB') # pillow默认RGB格式
Grayimg = Image.open("000000.jpg").convert('L') # 灰度化
print(img.size) # pillow读取图片的size为宽、高
print(Grayimg.size) # pillow读取灰度图的size为宽、高
print(type(img)) # pillow读取图片的数据类型
print(type(Grayimg)) # pillow读取灰度图的数据类型
print(img) # pillow读取图片的图片数据
print(Grayimg) # pillow读取灰度图的图片数据
输出结果如图示:
4 matplotlib处理图片
matplotlib读、写以及展示图片等操作
import matplotlib.pyplot as plt# matplotlib读取图片
plt_img = plt.imread("000000.jpg") # 读取图片
plt.imshow(plt_img) # 交互模式中imshow就显示了,脚本模式中要多加plt.show()
plt.show() # 展示图片
plt.imsave("plt_out.jpg", plt_img) # 保存图片
输出结果如图示:
matplotlib读取图片的形状、大小、编码格式、数据类型等
import matplotlib.pyplot as plt# matplotlib处理图片
plt_img = plt.imread("000000.jpg") # 读取图片(默认RGB格式)
print(plt_img.shape) # matplotlib读取图片的shape为高、宽、通道数
print(plt_img.size) # matplotlib读取图片的size为像素和
print(plt_img.dtype) # matplotlib读取图片的编码格式
print(type(plt_img)) # matplotlib读取图片的数据类型
# print(plt_img) # matplotlib读取图片的图片数据
输出结果如图示:
5 opencv、pillow和matplotlib相互转换
opencv转pillow
import cv2
from PIL import Image# opencv转pillow(先转通道,再转类型)
image = cv2.imread(r"000000.jpg") # 读取图片
rgb_img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转通道
# cv2.COLOR_BGR2RGB 与 COLOR_RGB2BGR 都是4, 相当于
# rgb_img = cv_img[:, :, [2, 1, 0]]
print(image.shape) # opencv读取图片的shape为高、宽、通道数
print(image.size) # opencv读取图片的size为像素和
print(image.dtype) # opencv读取图片的编码格式
print(type(image)) # opencv读取图片的数据类型
# print(image) # opencv读取图片的图片数据
# print(GrayImage) # opencv读取灰度图的图片数据
pil_img = Image.fromarray(rgb_img) # 转类型
# pil_img.show()
print(pil_img.size) # pillow读取图片的size为宽、高
print(type(pil_img)) # pillow读取图片的数据类型
print(pil_img) # pillow读取图片的图片数据
输出结果如图示:
pillow转opencv
import cv2
import numpy as np
from PIL import Image# pillow转opencv
pil_img = Image.open("000000.jpg").convert('RGB') # pillow默认RGB格式
pil_np_img = np.array(pil_img) # 转为numpy格式
cv2.namedWindow('img1', cv2.WINDOW_NORMAL)
cv2.imshow('img1', pil_np_img) # opencv读取图片为BGR格式
cv2.waitKey(2000) # 2s后自动销毁
cv2.destroyAllWindows()
print(pil_np_img.shape)
print(pil_np_img.size)
print(pil_np_img.dtype)
print(type(pil_np_img))
# print(pil_np_img)
输出结果如图示:
matplotlib转opencv
import cv2
import matplotlib.pyplot as pltplt_img = plt.imread("000000.jpg") # 读取图片(默认RGB格式)
# plt.imshow(plt_img)
# plt.show()
print(plt_img.shape) # matplotlib读取图片的shape为高、宽、通道数
print(plt_img.size) # matplotlib读取图片的size为像素和
print(plt_img.dtype) # matplotlib读取图片的编码格式
print(type(plt_img)) # matplotlib读取图片的数据类型
# print(plt_img) # matplotlib读取图片的图片数据
img_cv = cv2.cvtColor(plt_img, cv2.COLOR_RGB2BGR) # RGB转BGR
# cv2.imshow('img', img_cv) # 显示图片
cv2.waitKey(0)
cv2.destroyAllWindows()
GrayImage = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY) # opencv读取图片默认为BGR格式,灰度化
print(img_cv.shape) # opencv读取图片的shape为高、宽、通道数
print(img_cv.size) # opencv读取图片的size为像素和
print(GrayImage.shape) # opencv读取灰度图的shape为高、宽(通道数默认为1不显示)
print(GrayImage.size) # opencv读取灰度图的size为像素和
print(img_cv.dtype) # opencv读取图片的编码格式
print(GrayImage.dtype) # opencv读取灰度图的编码格式
print(type(img_cv)) # opencv读取图片的数据类型
print(type(GrayImage)) # opencv读取灰度图的数据类型
# print(image) # opencv读取图片的图片数据
# print(GrayImage) # opencv读取灰度图的图片数据
输出结果如图示:
6 总结
三者转换的时候,转换的是数据类型和通道顺序。